- 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就好了