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

删除数组内指针触发malloc错误,请求技术排查与解决

错误原因与解决方案

问题根源

  • 执行delete array[i]时,array[i]指向的是栈内存中的val[i]。delete只能用于释放通过new(或new[])在堆上分配的内存,手动释放栈内存会触发系统报错。
  • 额外错误:delete[] array也是错误操作,因为int* array[max]是栈上声明的指针数组,同样不需要手动释放。

修正方案

根据需求,有两种正确处理方式:

方式1:使用动态堆内存(需手动释放)

如果需要动态分配内存,修改指针赋值逻辑,用new创建每个元素:

#include <iostream>
#include <random>
#include <ctime>
using namespace std;

int main()
{
    default_random_engine gen(time(0));
    uniform_int_distribution<> dis(1, 100);

    const int max = 20;
    
    int* array[max];

    // 为每个指针分配堆内存并初始化
    for (int i = 0; i < max; i++) {
        array[i] = new int(dis(gen));
    }

    //... 对array的修改操作

    // 输出数组内容
    for (int i = 0; i < max; i++) {
        cout << *array[i] << " ";
    }
    
    // 正确释放每个堆内存对象
    for (int i = 0; i < max; i++)
    { 
        delete array[i];
    }

    return 0;
}

方式2:使用栈内存(无需手动释放)

如果只是用指针指向栈数组元素,不需要任何手动释放操作,栈内存会在作用域结束时自动回收:

#include <iostream>
#include <random>
#include <ctime>
using namespace std;

int main()
{
    default_random_engine gen(time(0));
    uniform_int_distribution<> dis(1, 100);

    const int max = 20;
    
    int* array[max];
    int val[max];

    for (int i = 0; i < max; i++) {
        val[i] = dis(gen);
    }

    for (int i = 0; i < max; i++)
    {
        array[i] = &val[i];
    }

   //... 对array的修改操作

    // 输出数组内容
    for (int i = 0; i < max; i++) {
        cout << val[i] << " ";
    }
    
    // 无需任何delete操作
    return 0;
}

关键规则

  • 配对使用:new对应delete,new[]对应delete[],只能释放堆上分配的内存。
  • 栈内存自动管理:局部变量、栈数组的内存由系统在作用域结束时自动释放,禁止手动调用delete。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 05:35:19