这个问题在这里已有答案:
我正在尝试一些代码。错误地写下面的代码(Luckily Now)
片段1
#include<iostream>
using namespace std;
class A {
public:
A() { cout << "A()" << endl; }
~A() { cout << "~A()" << endl; }
void print() { cout << "A::print()=>" <<this<< endl; }
};
int main() {
A* a = new A;
a->print();
delete a;
a = NULL;
cout << a << endl;
a->print();
return 0;
}
据我所知,由于我删除了“a”,程序应该已经崩溃(现在不是这么真实)。但事实并非如此。有人可以解释一下这背后的原因。输出图像也已附加。
但是只要我在上面的程序中包含任何成员变量,它就会崩溃。怎么样 ?为什么?请参阅计划2。
片段2
class A {
int val;
public:
A() { cout << "A()" << endl; }
~A() { cout << "~A()" << endl; }
void print() { cout << "A::print()=>" <<this << val << endl; }
};
int main() {
A* a = new A;
a->print();
delete a;
a = NULL;
cout << a << endl;
a->print();
return 0;
}
上面的程序崩溃了。为什么不是第一个节目?
PS:有可能是重复的问题。我试图找到这样的问题,但找不到。虽然我得到了this question,但我觉得它和我想要的不一样。
第一个不会取消引用任何内容指向的任何内存,因此它可能不会崩溃。你只打印出this
这是一个指针值而你没有取消引用它。请注意,这并不意味着它没关系并且始终有效!绝对不允许也不应该这样做。完成此操作后会发生什么是未定义的。
您的第二个示例实际上尝试使用成员变量,这意味着尝试访问无效的内存。这也是未定义的行为,可能会导致崩溃或其他问题。这是未定义的。