#include <string>
using std::string;
class Trie
{
private:
Trie* p[26];
bool end;
void clear(Trie* pt)
{
for (int i = 0; i < 26; ++i)
{
if (pt->p[i])
{
clear(pt->p[i]);
delete pt->p[i];
}
}
}
public:
Trie():p(), end(false)
{}
void insert(string word)
{
Trie* pt = this;
for (int i = 0; i < word.size(); ++i)
{
int idx = word[i] - 'a';
if (!pt->p[idx])
{
pt->p[idx] = new Trie();
}
pt = pt->p[idx];
}
pt->end = true;
}
~Trie()
{
clear(this);
}
};
我在VS中调试并发现每次运行此行删除pt-> p [i]时,将再次调用解构函数,然后递归调用clear()函数。
此外,pt-> p [i]仍将指向相同的内存块,除非它无法访问。
在leetcode的这个问题的讨论部分中,大多数解决方案首先构建一个类TrieNode,因此如果删除TrieNode它不会引起问题,但我只是想知道我是否可以使我的代码仅使用一个类定义。
非常感谢提前!
对于给定的i
,你要清除p[i]
两次。
进入:clear(pt->p[i]);
第二次在delete pt->p[i];
,它只是叫clear(this)
,其中this
是来自父母的pt->p[i]
。
您应该跳过clear(pt->pt[i])
调用,因为它是由析构函数处理的。
对于仍然存在的指针,这正是应该发生的事情。在delete pt->p[i]
之后,你可以使pt->p[i]
无效。
PS:s / deconstructor / destructor /