我的testing.cpp中有这个:
class Supp{
public:
virtual Supp* add(Supp& val) = 0;
};
class SubA : public Supp{
public:
int val;
SubA(int a){
val = a;
}
int getVal(){
return val;
}
Supp* add(Supp& value){
SubA& a = dynamic_cast<SubA&>(value);
int tempVal = a.getVal();
int sum = val + tempVal;
SubA b =SubA(sum);
return &b;
}
};
和线条
SubA b = SubA(sum);
return &b;
给出并错误,因为它将地址返回到局部变量,这是非常不好做的,所以我将其更改为
SubA* b =new SubA(sum);
return b;
它工作正常,没有错误,但这不是基本上相同的事情吗?为什么这对编译器来说是合法的,而以前的版本则不然?
将地址返回到局部变量是非法的,因为一旦函数返回,局部变量就不再存在,因此您返回的地址已知不再有效。 (该对象可能仍然存在于其中,但它的析构函数已经被调用,并且它占用的内存将在某个时候用于其他用途——也许是在下一个子例程调用中。)
之所以可以返回返回的地址new
该地址没有指向位于临时位置的对象(您的程序堆栈是通常放置局部变量的位置);相反,它来自堆内存,该内存将一直存在,直到您将其释放为止。该对象不依赖于它分配的代码范围,因为它不是该范围的本地对象。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)