我正在尝试一些代码。错误地写了下面的代码(幸运的是现在)
代码段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,但我觉得它与我要寻找的不一样。
答案 0 :(得分:1)
第一个不会取消引用任何东西指向的内存,因此可能不会崩溃。您只打印出this
,它是一个指针值,并且不会取消引用它。请注意,这并不表示可以正常使用!绝对不允许,不应该这样做。完成后会发生什么事?未定义。
您的第二个示例实际上尝试使用成员变量,这意味着试图访问无效的内存。这也是未定义的行为,可能会导致崩溃或其他原因。它是未定义的。