我在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返回的地址是可以的,原因是该地址未指向驻留在临时位置的对象(您的程序堆栈通常是本地人所在的位置);而是来自堆内存,该内存将一直持续到您将其处置为止。该对象不依赖于其分配的代码范围,因为它不是该范围的本地对象。

10-01 18:10