本地声明的对象的内部存储器在外部范围内完好无损?

时间:2013-05-18 18:56:41

标签: c++ pointers scope

函数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

为什么?

1 个答案:

答案 0 :(得分:3)

标准从未说过你应该期待“垃圾价值”。相反,它说你会得到未定义的行为。由于您没有遵循三(或五)规则,因此当int返回时,动态分配的f1数组将被销毁,而对象a最终会被指向被销毁的指针阵列。要访问它,会给您带来未定义的行为。

您可能看到值2的原因是因为内存位置未被重用,因为值2在那里。然而,就标准而言,对此的推理毫无意义。