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
相关产品推荐
相关产品推荐

