读书人

求解一个关于临时对象的有关问题

发布时间: 2013-09-24 10:59:52 作者: rapoo

求解一个关于临时对象的问题

class A
{
public:
A(char* ss)
{
strcpy(s,ss);
}
~A()
{
//strcpy(s,"0000");
}
char s[10];
};


对于类A,
char* c=A("a").s;
是未定义行为, ,但我无论如何测试c的值始终是"a"
请问c不是"a"的例外情况是什么,到底能不能这样用,希望大家多多指导!
[解决办法]
引用:
Quote: 引用:

不能这么用
给A加上析构函数,析构函数中将s设置为空。

不加析构的话,虽然s[10]会自动释放
但char* c=A("a").s;中的c一直有效,不知哪种情况下c会失效(c指向的内存改变)


可能再某种情况下造成指针悬空,造成不可预知的问题。
[解决办法]
引用:
to FengPrince,ganpengjin1:
我知道这样是不对的,但始终没找到例外的情况.

FengPrince的代码在我这运行两次输出都是a, 我用的vs2013.
我想找到那个例外情况

这不是例外不例外的问题,编译执行没错不代表是正确的。
使用临时对象的返回值就是错的。
不能有其他的解决方法吗?
你一定要这样用临时对象返回值的理由是什么?
[解决办法]
你可以
(1) 把代码搞的更复杂。
(2) 多试几种编译器,e.g., g++, icc, clang++ ...。
(3) 多换几个平台,e.g., ubuntu, mac ..., 32-bit, 64-bit ...。
看看有没有机会看到垃圾数据或者程序崩溃什么的。
ps. 就上楼上说的,这种“钻研”也没太大意义。
[解决办法]
引用:
to ananluowei:
谢谢
我也知道不能这样用, 但想知道例外情况是什么,所以发了这个帖子

VC6下才用O2编译.
class A
{
public:
A(char* ss)
{
strcpy(s,ss);
}
~A()
{
//strcpy(s,"0000");
}
char s[10];
};

int main()
{
char* p = 0;
{
p = A( "aaaaa" ).s;
}
{
char s[10] = "12345";


scanf( "" ,s );
}
puts( p );
return 0;
}

读书人网 >C++

热点推荐