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

C++删除动态分配数组触发Debug Assertion Failed错误如何解决?

错误触发原因

该错误的核心诱因是动态内存分配与释放规则不匹配,C++中内存申请和释放必须严格遵循配对原则:

  • 单个对象通过new申请时,必须用delete单独释放
  • 连续数组通过new[]申请时,才需要用delete[]批量释放

你代码中的obj是栈上直接分配的指针对象数组,本身不属于堆内存,无法通过delete/delete[]释放;数组内的3个元素才是通过new单独申请的Myclass堆对象。你直接对栈内存地址obj调用delete[],完全不符合内存操作规则,因此触发调试断言报错。

修复示例

方案1:逐个释放单独申请的堆对象(最适配当前代码的修复)

仅需将错误的delete[] obj替换为循环释放每个指针指向的堆对象即可:

#include <iostream>
using namespace std;

class Myclass
{
public:    
    void print()
    {
        cout << "Hello from Myclass" << endl;
    }
};

int main()
{
    Myclass *obj[3] = { new Myclass, new Myclass, new Myclass };

    // Call each object's print function.
    for (int index=0; index < 3; index++)
    {
        obj[index]->print();
    }

    // 修复:逐个释放每个单独new出来的Myclass对象
    for (int index=0; index < 3; index++)
    {
        delete obj[index];
    }

    return 0;
}

方案2:数组改为堆分配,适配delete[]释放规则

如果你需要使用delete[]释放数组本身,可以将指针数组也改为堆上申请的形式:

#include <iostream>
using namespace std;

class Myclass
{
public:    
    void print()
    {
        cout << "Hello from Myclass" << endl;
    }
};

int main()
{
    // 堆上申请包含3个Myclass指针的数组,后续可通过delete[]释放
    Myclass **obj = new Myclass*[3];
    for (int i=0; i<3; i++) {
        obj[i] = new Myclass;
    }

    for (int index=0; index < 3; index++)
    {
        obj[index]->print();
    }

    // 先释放每个单独申请的Myclass对象
    for (int index=0; index < 3; index++)
    {
        delete obj[index];
    }
    // 再释放堆上的指针数组
    delete[] obj;

    return 0;
}

内容的提问来源于stack exchange,提问作者Rat Girl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 22:54:04