C++ 具有堆对象和销毁冲突的数据类型的浅层复制

C++ 具有堆对象和销毁冲突的数据类型的浅层复制,c++,destructor,shallow-copy,C++,Destructor,Shallow Copy,我有以下数据类型: class A{ public: A(){ } ~A(){ for(size_t i=0; i<b_elements.size(); i++) delete b_elements[i]; b_elements.clear(); } vector<B*> b_elements; //other operations ... }; A类{ 公众: (){ }

我有以下数据类型:

class A{
public:
    A(){
    }
    ~A(){
        for(size_t i=0; i<b_elements.size(); i++)
            delete b_elements[i];
        b_elements.clear();
    }
    vector<B*> b_elements;
    //other operations ...
};
A类{
公众:
(){
}
~A(){

对于(size_t i=0;i共享指针的存储向量:

class A{
public:
    A(){
    }
    vector<std::shared_ptr<B>> b_elements;
    //other operations ...
};
A类{
公众:
(){
}
向量b_元素;
//其他操作。。。
};

或向量的共享指针

class A{
public:
    A(){
    }
    std::shared_ptr< std::vector<B*> > b_elements;
    //other operations ...
};
A类{
公众:
(){
}
std::shared_ptrb_元素;
//其他操作。。。
};

使用这种方法,最后只销毁向量,而不销毁其元素。

请注意,此解决方案将保留类
B
的对象,直到删除类
A
的两个对象。如果要自动使“较小的
A
对象中的所有引用无效(即,如果该对象在较大的对象上仅具有“视图”的语义),则您必须找到另一种解决方案。我对shared_ptr不太了解,但据我所知,它是一种引用计数数据类型,在引用数为零时会被销毁,销毁后会自动取消分配(删除)它引用的对象(因此不再需要A的析构函数)是否正确?@H.Josef这是正确的。编译器合成的析构函数可以。@H.Josef您可以使用boost中的shared_ptr,它的行为方式相同,并且在相当旧的编译器上受支持。@H.Josef shared_ptr在boost中仅是头,您不太可能拥有有什么问题吗。