我遇到了一个编译好的项目,但在启动之前甚至在到达InitInstance()之前崩溃了。 将字符串添加到结构中后会发生这种情况:
typedef struct
{
long nChannelIndex;
TCHAR szChannelName[32];
DWORD dwStartTime; // time_t
DWORD dwPlaytimeMs; // msecs
TCHAR szStepName[32];
TCHAR szFilename[MAX_PATH];
long nLenMs;
TCHAR szStepDescr[64];
DWORD dwSessionID;
TCHAR szLocationName[32];
long bInsertion;
BOOL nOrigin; // 0= local, 1= cuemaster,
TCHAR szList[32];
TCHAR szFSPath[MAX_PATH]; << THIS HERE IS THE PROBLEM
}REPORTDATA, *LPREPORTDATA;
当我添加结构的最后一个成员时,问题就开始了。如果我将数组大小减小到较小的数字(例如12),那么应用程序就可以正常运行。
我在chkstk.asm中遇到了崩溃 - 围绕这段代码:
; Find next lower page and probe
cs20:
sub eax, _PAGESIZE_ ; decrease by PAGESIZE
test dword ptr [eax],eax ; probe page.
jmp short cs10
我正在Windows 7 Ultimate 64位上编译32位c ++应用程序。 Msvc 2010。
我不是要求调试我的代码。只需包含代码即可显示触发崩溃的原因及其发生的位置。
任何想法? 谢谢你的帮助!
答案 0 :(得分:1)
发生崩溃的模块名称chkstk.asm
是发生了什么的线索。它会检查堆栈分配以确保您没有用完。通过向您的结构添加一个大的新元素,您似乎已经耗尽。使用单一结构耗尽堆栈空间非常困难,所以我假设你有一个数组。局部变量是分配给堆栈的,因此问题可能是包含这些结构数组的局部变量。
您可以使用/F
compiler switch为程序提供更多的堆栈空间。
您也可以使用vector
而不是数组,这将分配堆中的空间而不是堆栈中的空间。
答案 1 :(得分:0)
虽然确实无法正确诊断您提供的信息,但是您已经溢出堆栈是一个相当安全的假设。正如Mark Ransom所说,你可能在某个地方有一个大的本地数组。
编辑: 通常但不一定存储局部变量的堆栈在应用程序内部是有限大小的,通常在创建线程时分配,并且可以使用pthread_attr_setstacksize等OS函数进行配置,如果堆栈空间不足则可以选择一个选项是为了扩大你正在处理的线程的堆栈,虽然这通常不是一个好主意。
解决此问题的最简单,最安全的方法是通过调用C malloc或C ++ new在堆上分配大数据。堆通常比堆栈大许多个数量级,但是当你完成数据时需要显式的C free或C ++ delete,在本地作用域结束后就不会像堆栈变量那样清除它。
请注意,堆变量的主要问题是它们会泄漏,例如,通过抛出早期退出的函数。这就是为什么建议在处理堆对象时使用std :: unique_ptr来存储它,这符合RAII概念。