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
相关产品推荐
相关产品推荐

