首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2013-09-24 
求解一个关于临时对象的问题class A{public:A(char* ss){strcpy(s,ss)}~A(){//strcpy(s,0000)}char s[

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

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;
}

热点排行