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

C++自定义TwoD二维数组类出现core dumped错误,已实现拷贝构造等函数仍报错

问题分析与修复方案

1. core dumped含义

core dumped又称核心转储,是程序运行过程中发生不可恢复的致命错误时,操作系统将程序崩溃瞬间的内存、寄存器等运行状态导出到本地core文件的机制,通常触发原因包括内存越界访问、空指针解引用、重复释放内存、栈溢出等。

2. 代码中触发core dumped的根因

致命bug1:带参构造函数初始化错误

// 错误写法
TwoD(int r,int c):row(r),col(r)

这里你错误将列数col赋值为行数r,而不是传入的参数c,后续所有涉及col的操作都会出现内存越界:

  • 若传入的行数不等于列数,构造时按c列申请内存,但拷贝、相加、输出时都以r(行数)作为列数操作,直接访问到数组越界地址,触发非法内存访问
  • echo函数的异常也是这个原因导致:行列数不匹配时要么输出乱码,要么少输出内容,严重时直接崩溃

致命bug2:默认构造函数未初始化基础成员

默认构造函数没有初始化row和col的值,当你用默认构造创建TwoD d;后执行赋值操作时,赋值运算符中释放旧内存的逻辑会用未初始化的row值作为循环边界,行为完全未定义,大概率触发崩溃。

旧版本额外bug

  • 旧版本析构函数只释放了二级指针arr,没有先释放每个一维数组的内存,会出现内存泄漏,更新后的代码已经修复了这个问题
  • 旧版本拷贝构造函数没有先为arr申请二级指针内存,直接操作arr[i]属于空指针解引用,更新后的代码已经修复了这个问题

3. 核心修复代码

修正默认构造函数

TwoD():row(0),col(0){}

修正带参构造函数初始化列表

TwoD(int r,int c):row(r),col(c){
    cout<<"Enter "<<r<<" rows of "<<c<<" doubles each"<<endl;
    arr=new double*[row];
    for(int i=0;i<r;i++){
        arr[i]=new double[c];
        for(int j=0;j<c;j++){
            cin>>arr[i][j];
        }
    }
}

可选优化(加法运算合法性校验)

const TwoD operator+(const TwoD& a,const TwoD& b){
    // 先校验行列数匹配,避免非法访问
    if(a.row!=b.row || a.col!=b.col){
        throw "矩阵行列数不匹配,无法相加";
    }
    TwoD temp(a);
    for(int i=0;i<a.row;i++){
        for(int j=0;j<a.col;j++){
            temp.arr[i][j]+=b.arr[i][j];
        }
    }
    return temp;
}

完成以上修改后core dumped问题即可解决,echo函数的输出异常也会同步恢复正常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 19:06:03