C++指针实现的二维数组释放时持续报malloc错误如何解决?
核心错误原因
- 内存释放配对逻辑错误:
new和delete必须严格对应,你分配行内存时用的是new int[n]一次性分配了连续n个int的数组,没有为单个int元素单独调用new,所以完全不需要遍历每个j去delete ((*(ptr+i))+j)。这行代码尝试释放没有单独分配过的数组内部元素地址,是触发malloc报错的直接原因。 - 构造函数存在隐患:无参构造函数中
m=0时new int*[m]属于零长度数组分配,C++标准中这种行为的结果由编译器实现定义,且你在构造函数中new的length_arr没有保存在类成员中,也没有释放,存在内存泄漏。 - 赋值运算符设计不规范:当前返回值为
void,不符合C++赋值运算符的常规设计(需要返回MyMatrix&支持链式赋值),同时没有判断自赋值的情况,如果出现a=a的调用会直接释放自身内存,导致后续访问错误。
修复代码
1. 析构函数修复
直接删除内层遍历单个元素的for循环即可:
~MyMatrix() { for(int i = 0; i < m; i++) { // i < m 等价于 i <= m-1,可读性更高 delete[] ptr[i]; // 只需要释放每一行的数组内存 } delete[] ptr; // 如果你后续把length_arr改为类成员,这里需要补充 delete[] length_arr; }
2. 赋值运算符修复
补充自赋值判断,删除错误的单层元素释放逻辑,调整返回值适配链式赋值:
MyMatrix& operator = (const MyMatrix &obj) { // 自赋值直接返回,避免释放自身内存后访问出错 if (this == &obj) { return *this; } // 释放原有内存 for(int i = 0; i < m; i++) { delete[] ptr[i]; } delete[] ptr; // 按传入对象尺寸分配新内存 m = obj.m; n = obj.n; ptr = new int*[m]; for (int i = 0; i < m; i++) { ptr[i] = new int[n]; // 拷贝元素 for (int j = 0; j < n; j++) { ptr[i][j] = obj.ptr[i][j]; } } return *this; }
3. 构造函数优化
建议改用带行列参数的构造函数,避免零长度数组分配的不确定性:
MyMatrix(int rows = 0, int cols = 0) : m(rows), n(cols) { if (m <= 0 || n <= 0) { ptr = nullptr; return; } ptr = new int*[m]; for (int i = 0; i < m; i++) { ptr[i] = new int[n]{}; // 花括号默认初始化所有元素为0 } }
内容的提问来源于stack exchange,提问作者ayesha
相关产品推荐
相关产品推荐

