当前位置: 代码迷 >> QT开发 >> delete 与析构函数 再度发问?
  详细解决方案

delete 与析构函数 再度发问?

热度:28   发布时间:2016-04-25 04:39:42.0
delete 与析构函数 再次发问??
C/C++ code
class B{public:    B *b;    B() {}    ~B()    {        cout<<"~B() 被调用"<<endl;        system("pause");    }    B* functionB()    {        b = new B();        cout<<"functionB 被调用"<<endl;        return b;    }};class A{public:    B *a_b;    A() {}    ~A(void)    {        cout<<"~A() 被调用"<<endl;        delete a_b;    }    void functionA()    {        a_b = new B();        cout<<"functionA 被调用"<<endl;        a_b->functionB();    }};void main(){    A *a = new A();    a->functionA();    delete a;}输出内容:functionA 被调用          functionB 被调用          ~A() 被调用          ~B() 被调用


认真一看,就会发现有内存泄漏:
C/C++ code
    B* functionB()    {        b = new B();        cout<<"functionB 被调用"<<endl;        return b;    }在functionB中我们创建了B,但是没有删除。

提问:此时的对象b,什么时候删除?如何删除呢?(PS:对象b可能在class B中多次调用)

b肯定不能在~B()中删除,如果在~B()中删除的话,程序就会一直执行析构函数。。。


------解决方案--------------------
在构造里面加上 b = NULL;
------解决方案--------------------
类B的析构函数~B()是在B类的某个对象被删除的时候调用的一个函数:
B *b = new B(); // 这个时候B的构造函数B()被调用
delete b; // 这个时候B的析构函数~B()被调用

所以说你不能在B的析构函数里面去删除某个B类的对象,否则它会被删除两次,自然要崩溃
你应该记录下b指针,然后在这个对象不在需要的时候delete就好了
  相关解决方案