C++ 泛型树的析构函数

C++ 泛型树的析构函数,c++,oop,C++,Oop,我有一个通用树: Node{ int information; vector<Node*> childs; } 节点{ 智力信息; 媒介儿童; } 这是我的析构函数实现: ~Node(){ for(int i = 0; i < childs.size(); i++) { delete childs[i]; } ~Node(){ 对于(int i=0;i STD::SysDypPTR …现在插入是一个问题,因为创建完全独立的S

我有一个通用树:

Node{
    int information;
    vector<Node*> childs;
}
节点{
智力信息;
媒介儿童;
}
这是我的析构函数实现:

~Node(){
    for(int i = 0; i < childs.size(); i++) {
        delete childs[i];
    }
~Node(){
对于(int i=0;i
问题是我允许childs是相同的。例如:NodeA有childs B,C,B,C,C。这破坏了析构函数的实现,因为B不能被删除两次


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

这可以通过使用
共享\u ptr
而不是向量中的原始指针来解决,该指针将为您进行管理,您只需清除向量(这是我的建议),或者在删除每个节点之前将节点列表传输到集合中,或者在析构函数中维护已删除节点的列表,并检查已删除列表中是否存在指针(集合可以相对有效地执行此操作)


要使用
shared\u ptr
您需要在对象创建后使用
shared\u ptr
引用对象。因此,检索它们以及多重插入机制也需要使用它们。

首先一个小的理论说明:这不是树,
但是一个更通用的图,因为树没有圈

关于您的问题,一个快速的解决方案是对所有子项进行排序(按地址);然后您可以在迭代时轻松识别重复项的位置,并跳过它们。如下所示:

if(childs.size() == 0) return;
std::sort(childs.begin(), childs.end());
childs.remove(std::unique(childs.begin(), childs.end()), childs.end());
for (auto& child : childs) delete child;

考虑使用智能指针,例如:代码> STD::SysDypPTR …现在插入是一个问题,因为创建完全独立的SydDypTr根本没有帮助。@ DeavangFin,如果它们是完全相同的对象,它们是如何插入/引用的?如果不再使用原始指针,则SydDypTR被传递,然后损坏T。hey不会是完全独立的shared_ptr。我认为这是显而易见的。所以我必须解释一下。
我认为这是显而易见的。
如果你从树外部使用shared_ptr,是的……我认为更像是在树类内部创建shared_ptr,因为它从外部获得了一个原始指针。@deviantfan,尽管使用了
shared_ptr
更现代,更容易正确,你的答案解决了OPs问题嗯,如果最后一个元素是唯一的,它将被泄漏。排序后,我会选择:
childs.remove(std::unique(childs.begin(),childs.end()),childs.end();
for(auto&child:childs){delete child;}
或者,正如这里流行的那样,使用
共享的ptr
并使用默认析构函数。
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();
}
if(childs.size() == 0) return;
std::sort(childs.begin(), childs.end());
childs.remove(std::unique(childs.begin(), childs.end()), childs.end());
for (auto& child : childs) delete child;