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

C++指针实现的二维数组释放时持续报malloc错误如何解决?

核心错误原因

  1. 内存释放配对逻辑错误:new和delete必须严格对应,你分配行内存时用的是new int[n]一次性分配了连续n个int的数组,没有为单个int元素单独调用new,所以完全不需要遍历每个j去delete ((*(ptr+i))+j)。这行代码尝试释放没有单独分配过的数组内部元素地址,是触发malloc报错的直接原因。
  2. 构造函数存在隐患:无参构造函数中m=0时new int*[m]属于零长度数组分配,C++标准中这种行为的结果由编译器实现定义,且你在构造函数中new的length_arr没有保存在类成员中,也没有释放,存在内存泄漏。
  3. 赋值运算符设计不规范:当前返回值为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 15:15:03