当两个类共享同一个堆对象时,如何避免两次删除指针?我遇到过这样的问题:两个大类对象共享一个大对象。在初始函数中初始化。因为它很大,所以我不想复制它们。我在堆中分配它们并保存指针:
class A {
public:
A(C* in_p) : p(in_p){}
~A() {delete p;}
private:
C* p;
}
class B {
public:
B(C* in_p) : p(in_p){}
~B(){delete p;}
private:
C* p;
}
class C {
public:
~C() {...}
}
void initial(A* pa, B* pb) {
C* a = new C;
C* b = a;
pa = new A(a);
pb = new B(b);
... some other initialization codes
}
int main() {
A* pa = nullptr;;
B* pb = nullptr;
initial(pa, pb);
........ some processing codes
//clear up
delete pa;
delete pb;
}
但是当我清理它们时,问题是在A
销毁之后,C
类的实例不在堆中。thenB
的析构函数删除同一个堆区域,并调用C
的析构函数,它崩溃了,因为那里没有C
' 的指针,调用C->destructor
会崩溃。B不知道被删除C
后已经不存在了,销毁自己的成员不会改变。A
B
(C*)p
A
(C*)p
我既不能通过C* p
引用传递也不能传递C**
给 link和A
' s ,因为完成后,本地堆栈变量将不再存在。所以在, 's和's之后会存储未知的内存地址,使用时会崩溃。p
B
p
initial()
C*(a) C*(b)
initial()
A
(C**)p
B
(C**)p
那么在智能指针出现之前,C++ 用户自我管理的传统垃圾回收中的这种情况你是怎么处理的呢?