【发布时间】:2018-10-12 16:53:52
【问题描述】:
我正在使用 C++ 构建一个包含字典中的一堆单词的 trie 树。这就是我定义 TrieNode 并构建树的方式:
struct TrieNode {
TrieNode *children[26];
bool isWord;
TrieNode(): isWord(false) {} /* to be deleted */
};
void buildTree(TrieNode *root, string word) {
TrieNode *cur = root;
for (char c : word) {
if (!cur->children[c-'a'])
cur->children[c-'a'] = new TrieNode();
cur = cur->children[c-'a'];
}
cur->isWord = true;
}
这在某些编译器上运行良好,但在其他编译器上会产生一些奇怪的结果。比如有一次发现isWord被初始化为152,整个程序就崩溃了。我尝试在代码中删除上面标记的行,事情又解决了。这是怎么回事?
另外,“new TrieNode()”和“new TrieNode”有什么区别?有时我发现它们也会产生不同的结果。
【问题讨论】:
-
这是怎么回事? -- 你的程序有错误。这就是它的要点。
-
请为您的孩子使用
std::array<TrieNode*, 26>。并使用 children.at(idx) 而不是 children[idx] 访问它,因为您没有任何检查该字符串是否只有小的字母字符,您可能会访问超出范围的内存,这可能是您编写 152 的方式isWord 布尔值 -
“new TrieNode()”和“new TrieNode”有什么区别 -- 你没有在默认构造函数中初始化指向
nullptr的指针数组. 那是你会注意到差异的时候。 -
TrieNode看起来可能正在泄漏TrieNodes。没有 MCVE 很难确定。它也没有观察到Rule of Three/Five,这可能是一个非常有趣的错误源。