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

析构函数中删除二维数组指针导致程序崩溃问题求助

问题分析与解决方案

嘿,你的程序崩溃根源其实是数组下标越界访问——这可是C++里触发未定义行为的常见坑,难怪程序会时不时抽风崩溃!

具体问题出在哪?

在C++里,用new int*[N]创建的指针数组,合法下标范围是0到N-1(数组下标默认从0开始)。但你的构造函数里循环是从i=1跑到i<=N:

chess_b = new int*[N]; 
for (int i = 1; i <= N; i++) chess_b[i] = new int[N]; 

这里chess_b[N]已经超出了数组的合法边界,属于越界写入。这种操作会偷偷破坏堆内存的结构(比如覆盖内存分配器的元数据),有时候程序碰巧没触发问题,但析构时访问这些被破坏的内存,必然会大概率崩溃。

修正后的代码

把循环的下标范围改成0到N-1,确保所有访问都在数组的合法范围内:

构造函数

chess_b = new int*[N]; 
for (int i = 0; i < N; i++) {
    chess_b[i] = new int[N]; 
}

析构函数

for (int i = 0; i < N; i++) {
    delete[] chess_b[i]; 
}
delete[] chess_b;

更省心的替代方案:用标准容器代替手动内存管理

手动用new/delete管理二维数组很容易踩下标这类坑,建议直接改用C++标准库的std::vector,它会自动处理内存分配和释放,你甚至不需要写析构函数:

#include <vector>

// 把成员变量改成
std::vector<std::vector<int>> chess_b;

// 构造函数里初始化就行
chess_b.resize(N, std::vector<int>(N));

这样不仅彻底规避了内存管理错误,代码也更简洁易读,后续维护起来也省心。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:26:35