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

运行时检查失败#2:变量'e'周围堆栈损坏,求C++代码错误排查

解决Run-Time Check Failure #2 - Stack around the variable 'e' was corrupted错误

这个错误的根源是你的代码里存在非法内存访问和类成员声明错误,我来一步步帮你排查和修正:

核心错误分析

  1. 非法的类成员数组声明
    你的类里声明了int* pinakas[];,这是一个未指定大小的指针数组。在C++中,非静态类成员不能是未指定大小的数组——编译器无法确定这个数组需要占用多少内存,导致对象e的栈内存布局被破坏,后续访问数组元素时直接越界到栈的其他区域,最终触发栈损坏错误。

  2. 错误的动态内存分配逻辑
    构造函数里的*pinakas = new int(korifes);和*pinakas[0] = 89;存在双重问题:

    • pinakas本身是未初始化的数组,*pinakas访问的是数组第一个元素(野指针),给它赋值new int(korifes)已经是在操作非法内存;
    • 运算符优先级问题:*pinakas[0]等价于*(pinakas[0]),但pinakas[0]本身没有被正确分配空间,写入数据时直接越界破坏栈。

修正后的完整代码

#include<iostream>
#include <list>
using namespace std;

class Euler {
private:
    int korifes = 0;
    int akmes = 0;
    int** pinakas; // 修改为指针的指针,用于动态二维数组
public:
    void print() {
        cout << *pinakas[0];
        return;
    }
    Euler(int korifess, int akmess);
    ~Euler();
    void addAkmes(int kor1, int kor2);
};

Euler::Euler(int korifess, int akmess) : akmes(akmess), korifes(korifess) {
    // 第一步:分配外层指针数组,对应每个顶点
    pinakas = new int*[korifes];
    // 第二步:为第一个顶点分配内存并赋值(示例操作)
    pinakas[0] = new int(89); // 等价于 pinakas[0] = new int; *pinakas[0] = 89;
}

Euler::~Euler() {
    // 先释放每个顶点的内存
    for (int i = 0; i < korifes; ++i) {
        delete pinakas[i];
    }
    // 再释放外层指针数组
    delete[] pinakas;
}

void Euler::addAkmes(int kor1, int kor2) {
    // 这里可以实现邻接表的边添加逻辑,比如给对应顶点的数组扩容等
}

int main() {
    Euler e(2, 1);
    e.print(); // 输出89,运行正常
}

关键修正点说明

  • 将int* pinakas[];改为int** pinakas;:用动态分配的指针数组来替代非法的固定大小数组,这样可以在构造函数中根据顶点数量灵活分配内存。
  • 修正构造函数的内存分配逻辑:先分配外层的指针数组,再为每个顶点分配对应的内存空间,确保所有内存访问都是合法的。
  • 完善析构函数:因为现在是两层动态内存分配,需要先释放每个顶点的内存,再释放外层的指针数组,避免内存泄漏。

这样修改后,程序就能正常运行,不会再触发栈损坏的错误了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 20:12:35