gpt4 book ai didi

c++ - 返回局部变量的地址与返回局部变量的指针

转载 作者:行者123 更新时间:2023-11-30 01:53:47 25 4
gpt4 key购买 nike

我的 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);
返回 &b;

给出错误,因为它将地址返回到一个局部变量,这是非常糟糕的,所以我将其更改为

SubA* b =new SubA(sum);
返回 b;

它工作正常,没有错误,但这基本上不是一回事吗?为什么这对编译器是合法的,但以前的版本不是?

最佳答案

将地址返回给局部变量是非法的,原因是一旦函数返回,局部变量就不再存在,因此您返回的地址已知不再有效。 (该对象可能仍然存在,但它的析构函数已经被调用,并且它占用的内存将在某个时候用于其他事情——可能是在下一个子程序调用时。)

可以返回 new 返回的地址的原因是地址没有指向位于临时位置的对象(您的程序堆栈是通常放置局部变量的地方);相反,它来自堆内存,它会一直存在,直到您处理掉它。该对象不依赖于分配它的代码范围,因为它不是该范围的本地代码。

关于c++ - 返回局部变量的地址与返回局部变量的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22821372/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com