HEAP CORRUPTION DETECTED错误求助:C++动态数组程序异常排查
问题排查与修复
核心原因:类成员初始化顺序错误
C++中类成员的初始化顺序严格遵循类内声明的顺序,而非构造函数体内赋值的顺序。你的代码存在以下问题:
- 类内先声明
int num;,再声明int* a = new int[num]; - 构造函数体内对
num的赋值,是在所有成员变量初始化完成后才执行的 - 这意味着
a初始化时,num是未定义的垃圾值,分配的数组大小完全错误,后续写入数据必然越界,触发堆损坏检测
修复方案(推荐):使用构造函数初始化列表
通过初始化列表,确保num先被正确赋值,再用它分配数组内存:
#include <iostream> class dmas { public: int num; int* a; // 按类内成员声明顺序,先初始化num,再初始化a dmas(int size) : num(size), a(new int[num]) { } void logic() { for (int i = 0; i < num; i++) { a[i] = rand() % 100; } } void print() { for (int i = 0; i < num; i++) { std::cout << a[i] << std::endl; } } // 析构函数自动释放内存,避免重复释放风险 ~dmas() { delete [] a; } }; int main() { srand(time(NULL)); int size; std::cout << "Enter the size of the massive" << std::endl; std::cin >> size; dmas a(size); a.logic(); a.print(); return 0; }
额外说明
原代码中print方法负责释放内存,若该方法被多次调用会触发二次释放问题。将内存释放逻辑移至析构函数,可确保对象销毁时自动释放内存,避免此类风险。
内容的提问来源于stack exchange,提问作者asapRichi
相关产品推荐
相关产品推荐

