方法调用中引发的 C++ 异常
c++ exception thrown in method call
我正在C++中解决一个问题,但是我遇到了堆栈溢出异常,我说不出原因。main 方法调用 problem28(),但第一行应该在我的输出中打印"check",这并没有发生。如果我将 gridsize 定义为 501 或更小,它运行良好,但除此之外,它会引发堆栈溢出异常。
任何帮助将不胜感激。
#define right 0
#define down 1
#define left 2
#define up 3
#define gridsize 1001
int* next(int row, int col, int dir) {
int* newPos = new int[2];
newPos[0] = row;
newPos[1] = col;
switch(dir) {
case right:
newPos[1] += 1;
break;
case down:
newPos[0] += 1;
break;
case left:
newPos[1] -= 1;
break;
case up:
newPos[0] -= 1;
break;
}
return newPos;
}
int problem28() {
cout << "check" << endl;
int grid[gridsize][gridsize];
for (int i = 0; i < gridsize; i++)
for (int j = 0; j < gridsize; j++)
grid[i][j] = 0;
int* pos = new int[2];
pos[0] = pos[1] = gridsize / 2;
int dir = right;
for (int i = 1; i <= 1001; i++) {
grid[pos[0]][pos[1]] = i;
pos = next(pos[0], pos[1], dir);
int* npos;
npos = next(pos[0], pos[1], (dir + 1) % 4);
if (grid[npos[0]][npos[1]] == 0)
dir = (dir + 1) % 4;
}
cout << "generated grid" << endl;
int total = 0;
for (int i = 0; i < gridsize; i++) {
total += grid[i][i];
total += grid[i][gridsize - i - 1];
}
total -= grid[gridsize / 2][gridsize / 2];
return 0;
}
int main() {
problem28();
system("pause");
return EXIT_SUCCESS;
}
与整体内存相比,您的堆栈通常非常有限。由于problem28
似乎不是递归的,因此到目前为止,最有可能起作用的最简单修复方法是更改:
int grid[gridsize][gridsize];
自:
static int grid[gridsize][gridsize];
这将静态而不是本地为该阵列分配内存,这通常意味着它不再在堆栈上。
另一种可能性是使用 std::vector
而不是数组。这通常会从免费存储而不是本地分配其内存。小问题是vector
(本身)不提供 2D 寻址,因此您必须单独处理(例如,使用我在上一个答案中发布的array_2D)。
如果我将 gridsize 定义为 501 或更小,它运行良好,但除此之外,它会引发堆栈溢出异常。
整个grid
数组位于堆栈上。如果int
宽度为 32 位,则int[500][500]
需要 ~1MB,这恰好是某些操作系统上的默认最大堆栈大小。
您可以增加堆栈的大小,或者(最好)在堆上分配grid
。
问题似乎出在这里:
int grid[gridsize][gridsize];
您是否尝试过动态分配此 2D 阵列?
我建议您使用应用程序验证程序等程序来查找导致崩溃的问题:
应用程序验证程序下载
了解如何调试软件并了解正在发生的事情非常重要。请在调试器(Visual Studio,Eclipse)中运行代码,并查看它停止的位置。如果使用了应用程序验证程序,则它可能会在问题产生的位置停止。看看变量,看看它们是否有意义。查看您是否正在访问不应访问的内存位置。
若要将应用程序验证程序与 Visual Studio 配合使用,请安装它,然后在 C:\Windows 的 System32 文件夹中找到 appVerifier.exe。然后打开该文件并将其指向可执行文件。启用您认为正确的检查。然后在Visual Studio中运行它。
对于Linux,你可以(并且应该)使用valgrind来检测这类问题。
- 处理多个异常集合的C++方法
- 我在c++代码中生成了一个运行时#3异常
- 孤立代码块在结构中引发异常
- C++中的赋值发生,尽管右侧出现异常
- 从构造函数抛出异常时如何克服内存泄漏
- 异常属于C++中的线程还是进程
- 当类定义不可见时捕获异常
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- 为什么异常不退出程序?
- 为什么我应该在异常处理中使用std::cerr而不是std::cout
- 如何修复链表类实现的未处理异常0xDDDDDDDD
- 关于:C++中异常对象的范围:为什么我没有得到副本?
- 是什么导致了Unity 3D中的"错误线程异常"?
- 如何将strftime中的格式错误作为异常捕获
- 创建具有 new in 函数和"this is nullptr"异常的对象
- 尝试使用智能指针时引发异常
- 函数如何通知用户它基于函数原型抛出异常?
- 是否值得降低我的代码的可读性,以便在出现内存不足错误时提供异常安全性?
- 当我使用 C++ 中的 C# dll 来使用 Selenium 时,存在异常处理问题
- Pytorch torch.cholesky忽略异常