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

use*_*023 0 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;
}
Run Code Online (Sandbox Code Playgroud)

产量

joel-MacBook-Air:src joel$ ./test 
1
2
3
4
3
Run Code Online (Sandbox Code Playgroud)

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

Jos*_*eld 8

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

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

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