一棵普通树的破坏者

时间:2015-08-27 01:24:01

标签: c++ oop

我有一个通用树:

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不能被删除两次。

这个问题的最佳解决方案是什么?

1 个答案:

答案 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在创建对象后引用这些对象。因此检索它们,多重插入机制也需要使用它们。