f1
函数创建了一个 foo
的实例并设置了 foo.ptr[0] = 2
。
#include <iostream>
using namespace std;
class foo {
public:
int *ptr;
inline foo(int a) {
ptr = new int[a];
}
inline ~foo() {
delete[] ptr;
}
};
foo f1() {
foo a(5);
a.ptr[0] = 2;
return a;
}
int main() {
foo a = f1();
cout<<a.ptr[0]<<endl;
return 0;
}
我期望的输出是:垃圾值(value)。
f1
返回按值,这意味着制作了 a
的一个拷贝,这个拷贝甚至共享它们的 ( a
及其拷贝)各自的 ptr
指向。
在 f1
之外,a
被销毁。
它的析构函数被调用,它将释放 ptr
的内存。这意味着拷贝的 ptr
指向的内存位置也是无效的。所以,我希望输出一个垃圾值。
实际输出是2
。
为什么?
最佳答案
该标准从未说过您应该期待“垃圾值”。相反,它说你会得到未定义的行为。由于您没有遵循三(或五)的规则,因此当 f1
返回并且对象 a
以指向已销毁数组的指针结尾。访问它会给你未定义的行为。
您可能看到值 2
的原因是因为该内存位置自从值 2 存在以来就没有被重用。然而,就标准而言,对此进行推理是没有意义的。
关于c++ - 本地声明的对象的内部内存在范围外完好无损?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16627859/