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

C++类内通过引用传参实现矩阵深拷贝的问题修复

C++ Matrix类copy成员函数修复方案

现有copy函数仅完成空源判断、行列数赋值、堆内存分配流程,缺失实际数据拷贝逻辑,拷贝生成的对象会持有未初始化的随机内存值,无法正常使用。

需要在现有内存分配代码后补充三类数据的拷贝逻辑:

  • 二维矩阵matrixM的逐行逐列元素拷贝
  • 行求和数组sum_rowsM的全量元素拷贝
  • 列求和数组sum_colsM的全量元素拷贝

补全后的完整实现代码:

private:
double ** matrixM;   // 指向堆上存储的二级指针数组,存储矩阵每行的首地址
double* sum_rowsM;   // 指向堆上存储的行求和数组
double* sum_colsM;   // 指向堆上存储的列求和数组
int rowsM;           // 矩阵行数
int colsM;           // 矩阵列数

void Matrix::copy(const Matrix& source)
{
    // 源矩阵为空时直接初始化空对象返回
    if(source.matrixM == NULL){
        matrixM = NULL;
        sum_rowsM = NULL;
        sum_colsM = NULL;
        rowsM = 0;
        colsM = 0;
        return;
    }
    
    // 拷贝行列属性
    rowsM = source.rowsM;
    colsM = source.colsM;
    
    // 为行、列求和数组分配堆内存
    sum_rowsM = new double[rowsM];
    assert(sum_rowsM != NULL);
    
    sum_colsM = new double[colsM];
    assert(sum_colsM != NULL);
    
    // 为二维矩阵分配堆内存
    matrixM = new double*[rowsM];
    assert(matrixM !=NULL);
    for(int i =0; i < rowsM; i++){
        matrixM[i] = new double[colsM];
        assert(matrixM[i] != NULL);
    }

    // 补充:拷贝矩阵主体元素
    for(int i = 0; i < rowsM; i++){
        for(int j = 0; j < colsM; j++){
            matrixM[i][j] = source.matrixM[i][j];
        }
    }

    // 补充:拷贝行求和数组
    for(int i = 0; i < rowsM; i++){
        sum_rowsM[i] = source.sum_rowsM[i];
    }

    // 补充:拷贝列求和数组
    for(int j = 0; j < colsM; j++){
        sum_colsM[j] = source.sum_colsM[j];
    }
}

额外提醒:

  1. 调用copy函数前,必须先释放当前对象自身已经持有的堆内存,否则会出现内存泄漏
  2. 如果确认数组内存是连续分配的,逐元素循环可以替换为memcpy提升拷贝效率,逐元素遍历是兼容性最高、出错概率最低的实现方式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 07:09:16