我创建了一个程序,我想调试它(或运行),在函数main中的第一个运算符之前它会中断一条消息:name.exe中0x0020f677处的未处理异常:堆栈溢出。 为什么会发生这种情况以及如何解决问题? Visual C ++ 2010,Win32控制台应用程序。
EDIT1: 调试器在chkstk.asm上显示了asm代码。
为了解决这个问题,分析什么是重要的?头文件中添加的东西导致了这个问题吗?
答案 0 :(得分:8)
如果您删除了固定大小的数组并且其大小过大,则可能会出现此错误。
int fixedarray[1000000000];
尝试减少长度或在堆上创建它。
int * array = new int[1000000000];
不要忘记稍后删除它。
delete[] array;
但是,即使在C函数中,最好使用std :: vector而不是指针,
//...
int Old_C_Func(int * ptrs, unsigned len_);
//...
std::vector<int> intvec(1000000000);
int * intptr = &intvec[0];
int result = Old_C_Func(intptr,intvec.size());
假设32位编译。
答案 1 :(得分:3)
这听起来像一个对象构造函数或一个由一个触发的代码导致堆栈溢出。我将使用调试器来查看堆栈溢出是由什么引起的,请记住全局变量的构造函数可能是根本原因。
答案 2 :(得分:0)
如果stackoverflow错误是由深度递归或堆栈上的大对象引起的,您还可以通过增加堆栈大小来解决它。 Windows 1MB上堆栈的默认大小。您可以尝试将其增加到例如10MB
将以下行添加到Project属性 - &gt;链接器 - &gt;命令行
/ STACK:1000000,1000000
如果错误是由算法递归中的某些错误引起的,那么增加堆栈大小并没有帮助,你需要找到错误(可能在递归中)或极大的堆栈分配。
答案 3 :(得分:0)
我有类似的问题,没有调试信息,没有全局,没有超大数组。
我有一个带有一些#pragma_pack-ed结构的类,如果我在堆栈中构造这个类,那么就会出现这个错误。如果我在堆上分配它,运行正常。 (任何想法为什么?)