析构函数中删除二维数组指针导致程序崩溃问题求助
问题分析与解决方案
嘿,你的程序崩溃根源其实是数组下标越界访问——这可是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
相关产品推荐
相关产品推荐

