我正在使用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”之间有什么区别?有时我发现它们也会产生不同的结果。
答案 0 :(得分:0)
您的代码的问题是,您假定要初始化的成员。不幸的是,this is not true。因此,指向children
的指针不一定要初始化为nullptr
,这会使您的代码取消引用无效的指针,从而导致未定义的行为(UB)(例如,内存损坏,崩溃等)。
简单的解决方案:
在类中为数组添加默认的初始化程序:
TrieNode *children[26]{};
我的建议