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中仅是头,您不太可能拥有有什么问题吗。