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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 05:39:04