0

_ _ _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;
}
4

1 回答 1

0

删除实例后调用方法是未定义的行为。什么事情都可能发生。

可能的行为示例:

  1. 你得到“幸运”:free刚刚释放了内存但没有使其无效。实例部分完好,调用意外成功。
  2. free用垃圾(或标记值)覆盖内存,导致您跳转到一些疯狂的地址和段错误。
  3. free释放整个块,您尝试访问*p.
  4. 其他一些线程将 的地址system放入现在未使用的内存块中。您的堆栈恰好包含一个指向"rm -rf /". 您的硬盘驱动器被擦除,随之而来的是欢闹。

永远,永远,永远依赖未定义的行为。

于 2013-02-19T07:21:27.427 回答