You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
}

额外说明

  1. 把isEmpty改为isEndOfWord更符合Trie的常规设计,用来标记当前节点是否是某个单词的结束位置,这是Trie实现单词插入、查询的核心标志。
  2. 补充了析构函数的递归删除逻辑,避免内存泄漏——Trie是树形结构,手动管理内存时必须递归释放所有子节点。
  3. 永远不要试图访问nullptr指向的成员变量,这是C++里最常见的段错误原因之一。

内容的提问来源于stack exchange,提问作者ayoMax00379

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 00:45:02