我有一个通用树:
Node{
int information;
vector<Node*> childs;
}
这是我的析构函数实现:
~Node(){
for(int i = 0; i < childs.size(); i++) {
delete childs[i];
}
问题在于我允许孩子们一样。例如:NodeA有子B,C,B,C,C。这打破了析构函数的实现,因为B不能被删除两次。
这个问题的最佳解决方案是什么?
答案 0 :(得分:1)
这可以通过在你的向量中使用shared_ptr
代替原始指针来解决,这些指针可以为你进行管理,你只需要清除向量(这是我推荐的),或者转移列表删除每个节点之前的一组节点,或者在删除它们的析构函数中维护已删除节点的列表,并检查已删除列表中指针的存在(一个集合可以相对有效地执行此操作)。
vector<Node*> childs;
变为
vector<std::shared_ptr<Node>> childs; //Note you'll need a space between >, and shared_ptr may be in tr1 or boost if you aren't using c++11 or higher
和析构函数是:
~Node(){
childs.clear();
}
要使用shared_ptr
,您需要使用shared_ptr
在创建对象后引用这些对象。因此检索它们,多重插入机制也需要使用它们。