内存泄漏功能

时间:2013-02-19 07:19:33

标签: memory-leaks

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

1 个答案:

答案 0 :(得分:0)

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

可能行为的样本:

  1. 你得到“幸运”:free刚刚释放了内存但没有使它失效。该实例部分完好无损,呼叫成功。
  2. free用垃圾(或哨兵值)覆盖内存,导致你跳转到一些疯狂的地址和段错误。
  3. free取消分配整个块,并且您试图访问*p时会出现段错误。
  4. 其他一些线程将system的地址放在当前未使用的内存块中。您的堆栈恰好包含指向"rm -rf /"的指针。你的硬盘被抹去了,欢闹随之而来。
  5. 永远不要依赖未定义的行为。