我正在学习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。
答案 0 :(得分:8)
在销毁对象后访问对象是未定义的行为。你的程序可以做任何事情。碰巧你仍然得到值3
。
4.1 / 1 [conv.lval] 非函数的非数组类型T的glvalue可以转换为prvalue。 [...]如果glvalue引用的对象不是T类型的对象,并且不是从T或[...]派生的类型的对象,则需要此转换的程序具有未定义的行为。 / p>
访问对象的成员需要进行此转换。