修改结构后应用程序崩溃

时间:2016-08-09 14:54:31

标签: c++ windows visual-studio-2010

我遇到了一个编译好的项目,但在启动之前甚至在到达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。

我不是要求调试我的代码。只需包含代码即可显示触发崩溃的原因及其发生的位置。

任何想法? 谢谢你的帮助!

2 个答案:

答案 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概念。