为什么这个C ++代码没有从堆中删除对象?

时间:2014-01-18 13:53:12

标签: c++

我正在学习C ++,我已经编写了一些代码来获得手动创建和删除对象的一些经验。我不认为我完全理解删除的语义,因为print语句仍然打印3,我相信它不应该。

代码

#include <iostream>

class Test {
public:
    int x;
    int y;
};

using namespace std;

int main() {
    Test t1;
    t1.x = 1;
    t1.y = 2;
    cout << t1.x << endl;
    cout << t1.y <<endl;

    Test *t2 = new Test();
    t2->x = 3; t2->y = 4;
    cout << t2->x << endl;
    cout << t2->y <<endl;
    delete t2;

    cout << t2->x << endl;
}

输出

joel-MacBook-Air:src joel$ ./test 
1
2
3
4
3

请你能解释为什么它最后打印3?我的知识是,在删除对象时不应该打印3。

1 个答案:

答案 0 :(得分:8)

在销毁对象后访问对象是未定义的行为。你的程序可以做任何事情。碰巧你仍然得到值3

  

4.1 / 1 [conv.lval] 非函数的非数组类型T的glvalue可以转换为prvalue。 [...]如果glvalue引用的对象不是T类型的对象,并且不是从T或[...]派生的类型的对象,则需要此转换的程序具有未定义的行为。 / p>

访问对象的成员需要进行此转换。