2017-12-03 220 views
-1

我正在创建Trie的实现,TrieNode结构是个别节点和TrieSet类,它是完整的树。这里是我的TrieNode的签名:Trie树中的Trie节点的析构函数

struct TrieNode { 
    TrieNode(bool in, TrieNode *p); 
    ~TrieNode(); 
    void deleteChildren(TrieNode *node); 
    bool isLeafNode(); 

    bool inSet; 
    TrieNode *parent; 
    TrieNode *children[30]; 
}; 

我试图确定哪些第一递归删除所有的孩子,最后删除该节点的析构函数,但我得到一个分段错误。这里是我的构造函数,析构函数和它的帮助函数的代码:

TrieNode::TrieNode(bool in, TrieNode *p) 
{ 
    inSet = in; 
    parent = p; 
} 

TrieNode::~TrieNode() 
{ 
    for(int i = 0; i < 30; i++) 
    { 
     if(children[i] != nullptr) 
     { 
      delete children[i]; 
     } 
    } 
} 

任何帮助,将不胜感激,谢谢!

+0

您需要遵循三法则,五法则或零法则。 – aschepler

+0

你可以为你的构造函数添加代码吗? – 1201ProgramAlarm

回答

0

children数组未被初始化,所以数据将是随机垃圾并试图删除它们未定义的行为,并可能崩溃。

deleteChildren中调用delete node是错误的,因为它导致递归析构函数调用(就像在析构函数中调用delete this一样)。

可能还有其他问题。我没有广泛地看。

+0

谢谢,我修正了一些代码以摆脱递归调用。可悲的是,我仍然遇到一个seg故障。 – Alex