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

C++自定义BST插入数据仅存最后一条、修改isEmpty后崩溃如何解决

问题根因

1. BST类未初始化核心成员变量

BST类没有显式定义构造函数,创建实例时root指针和size变量都是未初始化的随机垃圾值,属于未定义行为,这是所有问题的核心诱因:

  • 原本用size == 0判断空树时,size的随机值大概率不为0,导致第一次插入就走非空分支,访问野指针root的内存,大部分情况下插入位置异常,只有最后一次插入的数据刚好能被后续打印逻辑读取,才出现只剩最后一条数据的现象
  • 修改isEmpty为判断root == nullptr后直接崩溃,是因为root初始是野指针,不会等于nullptr,代码还是会走非空分支访问野指针内存,直接触发非法访问崩溃

2. 其他关联问题

  • insert方法插入成功后从未更新size变量,就算用size判断空树逻辑也永远不对
  • 文件读取循环用while(!file.eof())会多读一行空数据,容易插入无效的空数据
  • 未校验createMovie的返回值,如果返回空指针后续解引用会直接崩溃

修复步骤

第一步:给BST添加默认构造函数

在BST.h的public方法中添加构造函数声明:

public:
    BST(); // 新增默认构造函数
    bool insert(Movie* movie);
    bool isEmpty();

在BST.cpp中实现构造函数,初始化核心成员:

BST::BST() : root(nullptr), size(0) {}

第二步:统一isEmpty判断逻辑

两种方案选一种即可,保持逻辑一致:
方案1(推荐,和结构强关联):

bool BST::isEmpty() {
    return root == nullptr;
}

方案2(用size判断):

bool BST::isEmpty() {
    return size == 0;
}

第三步:insert方法补充size更新

在insert方法的return true之前新增size++:

bool BST::insert(Movie* movie) {
    // ...原有逻辑不变
    size++; // 新增:插入成功后size自增
    return true;
}

第四步:修复文件读取逻辑

修改Store.cpp的buildMovies方法,避免多读空行、校验空指针:

void Store::buildMovies(ifstream& file) {
    if (!file) {
        cout << "Error: File not found." << endl;
        return;
    }
    string movieData;
    // 替换eof判断,直接用getline返回值做循环条件
    while (getline(file, movieData)) {
        // 跳过空行
        if (movieData.empty()) continue;
        Movie* newMovie = movieFactory.createMovie(movieData);
        // 校验返回值非空再插入
        if (newMovie == nullptr) continue;
        newMovie->setData(movieData);
        inventory.insert(newMovie);
    }
}

第五步:额外校验(可选)

如果修复后还是只有最后一条数据,检查MovieFactory::createMovie是否每次都返回同一个指针:如果所有节点的data都指向同一个Movie对象,每次setData都会覆盖上一次的值,自然只有最后一次的数据生效。
同时确认Movie类已经正确重载了<运算符,否则插入时的大小比较逻辑错误,会导致BST结构异常。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 08:45:04