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]; } }
额外提醒:
- 调用
copy函数前,必须先释放当前对象自身已经持有的堆内存,否则会出现内存泄漏- 如果确认数组内存是连续分配的,逐元素循环可以替换为
memcpy提升拷贝效率,逐元素遍历是兼容性最高、出错概率最低的实现方式
内容的提问来源于stack exchange,提问作者Lane Dafoe
相关产品推荐
相关产品推荐

