_ _ _Below程序在“delete p”和“p = NULL”之后调用MyClass :: processing时会崩溃,但是当尝试访问“MyClass :: a”时它会崩溃。为什么呢???
#include <iostream>
using namespace std;
class MyClass
{
public:
int a;
void processing()
{
cout<<"Processing"<<endl;
}
};
int main(void)
{
MyClass* p(new MyClass);
MyClass* q = p;
p->a = 10;
cout<<"p:: "<<p<<" q:: "<<q<<endl;
cout<<"p->a"<<p->a<<"q->a"<<q->a<<endl;
delete p;
p->processing(); // Watch out! p is now dangling!
cout<<"\n\nAfter Deletion::"<<endl;
cout<<"p:: "<<p<<" q:: "<<q<<endl;
cout<<"p->a"<<p->a<<"q->a"<<q->a<<endl;
p = NULL; // p is no longer dangling
cout<<"\n\nAfter Assigning null"<<endl;
p->processing(); // Watch out! p is now dangling!
q->processing(); // Ouch! q is still dangling!
cout<<"p:: "<<p<<" q:: "<<q<<endl;
}
答案 0 :(得分:0)
删除实例后调用方法是未定义的行为。任何事情都可能发生。
可能行为的样本:
free
刚刚释放了内存但没有使它失效。该实例部分完好无损,呼叫成功。free
用垃圾(或哨兵值)覆盖内存,导致你跳转到一些疯狂的地址和段错误。free
取消分配整个块,并且您试图访问*p
时会出现段错误。system
的地址放在当前未使用的内存块中。您的堆栈恰好包含指向"rm -rf /"
的指针。你的硬盘被抹去了,欢闹随之而来。永远不要依赖未定义的行为。