函数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;
}
我对输出的预期:垃圾值。
f1
按值返回 ,这意味着制作了a
的副本,此副本甚至共享了他们(a
和它的副本是ptr
点。
在f1
之外,a
被销毁。
它的析构函数被调用,它将释放ptr
的内存。这意味着副本ptr
指向的内存位置也无效。所以,我希望将垃圾值作为输出。
输出实际上是2
。
为什么?
答案 0 :(得分:3)
标准从未说过你应该期待“垃圾价值”。相反,它说你会得到未定义的行为。由于您没有遵循三(或五)规则,因此当int
返回时,动态分配的f1
数组将被销毁,而对象a
最终会被指向被销毁的指针阵列。要访问它,会给您带来未定义的行为。
您可能看到值2
的原因是因为内存位置未被重用,因为值2在那里。然而,就标准而言,对此的推理毫无意义。