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

