0

该函数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和它的副本)各自ptrs 指向的相同内存位置。

外面f1a被摧毁。它的析构函数被调用,它将释放ptr内存。这意味着副本ptr指向的内存位置也是无效的。所以,我期望一个垃圾值作为输出。

输出实际上是2.

为什么?

4

1 回答 1

3

该标准从未说过您应该期待“垃圾价值”。相反,它说你会得到未定义的行为。由于您没有遵循三(或五)的规则,因此动态分配的ints 数组在返回时被销毁,f1并且对象a以指向已销毁数组的指针结束。要访问它会给你未定义的行为。

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

于 2013-05-18T19:00:03.677 回答