【发布时间】:2015-09-18 17:20:16
【问题描述】:
当两个类共享同一个堆对象时,如何避免两次删除指针?我遇到过这样的问题:两个大类对象共享一个大对象。在初始函数中初始化。因为它很大,所以我不想复制它们。我在堆中分配它们并保存指针:
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 类的实例不在堆中。然后B的析构函数删除同一个堆区,并调用C的析构函数,由于那里没有C的指针而崩溃,调用C->destructor会崩溃。 B不知道C在A被删除后已经不存在,B的成员(C*)p在A销毁自己的(C*)p时不会改变。
我既不能通过引用传递C* p,也不能通过C**链接A的p和B的p,因为在initial()完成后,本地堆栈变量@987654342 @ 将不再存在。所以initial()后A的(C**)p和B的(C**)p会存储未知的内存地址,使用时会崩溃。
那么在智能指针出现之前,C++用户自管理传统垃圾回收的这种情况你是怎么处理的呢?
【问题讨论】:
-
initial不会通过引用(或**)获取pa和pb,因此该函数中对pa和pb的任何分配都不会反映在@987654354 之外@. -
欢迎来到 SO!你能提供一个minimal, complete, and reproducible example吗?您没有展示任何共享...
pa和pb拥有不同的C对象。 -
那么在智能指针出现之前,C++ 用户自行管理的传统垃圾回收中的这种情况如何处理? 程序员创建了自己的智能指针类。
-
你觉得智能指针是怎么写的?带着仙尘?
-
如果你有
nullptr,那么为什么没有std::shared_ptr?
标签: c++ pointers destruction