C++重载istream实现多项式输入时term存储NULL异常问题咨询
问题原因分析
- 核心bug出在
Newterm函数的扩容逻辑,你在完成数据迁移后错误释放了新申请的堆内存:
原错误扩容代码:
Term* tmp = new Term[capacity]; copy(termArray, termArray + terms, tmp); termArray = tmp; delete[] tmp;你将
termArray指向新申请的tmp内存后,立刻执行了delete[] tmp,直接导致termArray变为野指针,后续所有对termArray的写入操作都是对已释放内存的非法访问,自然会出现读取到NULL、乱值甚至程序崩溃的问题。
- 正确的扩容逻辑应该是迁移数据后释放旧内存,修正后的
Newterm代码如下:
void Newterm(float coef, int deg) { if (terms == capacity) { capacity *= 2; // 补充边界处理:如果初始capacity为0,扩容后至少设为1避免new空数组的未定义行为 if (capacity == 0) capacity = 1; Term* tmp = new Term[capacity]; copy(termArray, termArray + terms, tmp); // 保存旧内存地址 Term* old_term = termArray; // 切换到新内存 termArray = tmp; // 释放旧内存 delete[] old_term; } termArray[terms].degree = deg; termArray[terms++].coef = coef; }
- 额外需要确认:
Polynomial类的构造函数是否正确初始化了三个成员:terms初始为0,capacity初始为大于0的有效值(比如1),termArray初始指向对应大小的堆内存,避免未初始化的野指针问题。 - 你观察到的「项数为1时可正常运行」的现象完全吻合该bug的特征:如果初始
capacity为1,插入第一个元素时不会触发扩容逻辑,不会执行错误的内存释放操作,数据写入正常;一旦项数≥2就会触发扩容,执行错误的内存释放逻辑出现异常。
内容的提问来源于stack exchange,提问作者cuBerry
相关产品推荐
相关产品推荐

