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

C++矩阵类重载+运算符后运行出现Segmentation fault问题求助

解决矩阵加法中的Segmentation Fault问题

嘿,作为编程新手遇到段错误确实头疼,咱们来一步步拆解你的问题~

核心问题:未初始化的临时矩阵内存

你在operator+函数里创建的tmp对象是用默认构造函数mat()初始化的,而你的默认构造函数mat() {}什么都没做——这意味着tmp的r、c是随机的垃圾值,p指针也是野指针(指向内存里的随机位置)。当你尝试给tmp.p[i][j]赋值时,你在访问根本不属于你的内存,直接触发了“Segmentation fault”。

怎么修复?

最简单的解决方案就是:在创建tmp的时候,用带行列参数的构造函数给它分配好内存。因为加法操作的两个矩阵m1和m2是同维度的(你这里都是3x3),所以可以用当前对象的r和c来构造tmp。

修改后的operator+代码如下:

mat mat :: operator+(mat x){
    // 用当前矩阵的行列数构造tmp,自动完成内存分配
    mat tmp(r, c);
    int i,j;
    for(i=0;i<r;++i){
        for(j=0;j<c;++j){
            tmp.p[i][j] = p[i][j] + x.p[i][j];
        }
    }
    return tmp;
}

额外的新手友好提醒

为了避免以后再踩类似的坑,还有几个关键地方可以优化:

  • 完善默认构造函数:
    把默认构造函数改成初始化成员变量的版本,避免意外创建野指针对象:
    mat() : r(0), c(0), p(nullptr) {}
    
  • 添加析构函数:
    你的代码用new分配了内存,但没有对应的delete,会造成内存泄漏。添加析构函数来释放内存:
    ~mat() {
        // 先释放每一行的内存
        for(int i=0; i<r; ++i){
            delete[] p[i];
        }
        // 再释放存储行指针的数组
        delete[] p;
    }
    
  • 注意拷贝构造和赋值运算符:
    C++默认的拷贝是浅拷贝,多个矩阵对象会共享同一块内存,析构时会重复释放导致错误。如果以后需要拷贝矩阵,记得实现自己的拷贝构造函数和赋值运算符(这部分可以先作为进阶内容,等你解决当前问题后再研究)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:03:17