0

当两个类共享同一个堆对象时,如何避免两次删除指针?我遇到过这样的问题:两个大类对象共享一个大对象。在初始函数中初始化。因为它很大,所以我不想复制它们。我在堆中分配它们并保存指针:

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后已经不存在了,销毁自己的成员不会改变。AB(C*)pA(C*)p

我既不能通过C* p引用传递也不能传递C**给 link和A' s ,因为完成后,本地堆栈变量将不再存在。所以在, 's和's之后会存储未知的内存地址,使用时会崩溃。pBpinitial()C*(a) C*(b)initial()A(C**)pB(C**)p

那么在智能指针出现之前,C++ 用户自我管理的传统垃圾回收中的这种情况你是怎么处理的呢?

4

1 回答 1

2

使用std::shared_ptr. 如果没有,请使用boost::shared_ptr. 如果不能使用,就根据boost的设计自己写。除非您的 C++ 编译器已有数十年历史,否则我看不出有任何理由您不能使用这三个选项之一。

于 2015-09-18T21:14:00.993 回答