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

HEAP CORRUPTION DETECTED错误求助:C++动态数组程序异常排查

问题排查与修复

核心原因:类成员初始化顺序错误

C++中类成员的初始化顺序严格遵循类内声明的顺序,而非构造函数体内赋值的顺序。你的代码存在以下问题:

  1. 类内先声明int num;,再声明int* a = new int[num];
  2. 构造函数体内对num的赋值,是在所有成员变量初始化完成后才执行的
  3. 这意味着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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 06:45:42