C++实现Trie字典树时出现段错误,请求排查问题原因
问题分析与修复
你的段错误根源很明确:空指针解引用。
在Node的构造函数里,你先把children[i]赋值为nullptr,紧接着又试图通过temp->isEmpty = true访问这个空指针指向的内存——这直接违反了内存访问规则,必然触发段错误。另外代码里还有个拼写错误:children[I]里的大写I应该是小写i,不过这不是核心问题,核心是空指针操作。
Trie字典树的节点设计逻辑应该是:初始时节点的所有子节点指针都为nullptr,表示当前没有对应字符的子节点;只有当插入字符时,才会创建对应的子Node实例。
修正后的代码
#ifndef _TRIE_HPP_ #define _TRIE_HPP_ #include <iostream> using namespace std; class Node{ public: Node* children[26]; bool isEndOfWord; // 建议用这个命名更贴合Trie的语义,表示当前节点是否是一个单词的结尾 string val; Node(){ this->isEndOfWord = false; this->val = ""; // 初始化所有子节点指针为nullptr,表示暂未创建对应子节点 for(int i = 0; i<26; i++){ this->children[i] = nullptr; } } ~Node(){ // 析构函数需要递归删除所有子节点,避免内存泄漏 for(int i = 0; i<26; i++){ if(children[i] != nullptr){ delete children[i]; } } } }; int main(){ string input; Node* myTrie = new Node(); // 现在可以正常创建节点了 // 记得用完后释放内存 delete myTrie; return 0; }
额外说明
- 把
isEmpty改为isEndOfWord更符合Trie的常规设计,用来标记当前节点是否是某个单词的结束位置,这是Trie实现单词插入、查询的核心标志。 - 补充了析构函数的递归删除逻辑,避免内存泄漏——Trie是树形结构,手动管理内存时必须递归释放所有子节点。
- 永远不要试图访问
nullptr指向的成员变量,这是C++里最常见的段错误原因之一。
内容的提问来源于stack exchange,提问作者ayoMax00379
相关产品推荐
相关产品推荐

