在CString内崩溃

时间:2009-11-16 13:44:52

标签: c++ mfc crash-dumps

我正在观察我的应用程序中的崩溃,并且调用堆栈显示在下面

mfc42u!CString::AllocBeforeWrite+5    
mfc42u!CString::operator=+22 

不知道为什么会这样。这也不经常发生。 任何建议都会有帮助。我有崩溃转储,但无法继续进展。

我正在执行的操作是这样的

iParseErr += m_RawMessage[wMsgLen-32] != NC_SP;

其中m_RawMessage是512长度的char数组。 wMsgLen是unsigned short 和NC_SP定义为

#define NC_SP   0x20     // Space

修改

调用堆栈:

042afe3c 5f8090dd mfc42u!CString::AllocBeforeWrite+0x5 * WARNING: Unable to verify checksum for WP Communications Server.exe 
042afe50 0045f0c0 mfc42u!CString::operator=+0x22 
042aff10 5f814d6b WP_Communications_Server!CParserN1000::iCheckMessage(void)+0x665 [V:\CSAC\SourceCode\WP Communications Server\HW Parser N1000.cpp @ 1279] 
042aff80 77c3a3b0 mfc42u!_AfxThreadEntry+0xe6 
042affb4 7c80b729 msvcrt!_endthreadex+0xa9
042affec 00000000 kernel32!BaseThreadStart+0x37 

这是完整的调用堆栈,我已经发布了原始消息中的代码片段

由于

2 个答案:

答案 0 :(得分:4)

我有一个建议,对你来说可能有点令人沮丧:

CString :: AllocBeforeWrite确实暗示我,系统会尝试分配一些内存。

可能是,其他一些内存操作(特别是释放或调整内存大小)在以前被破坏了吗?

C / C ++内存管理的一个典型问题是,释放(或调整大小)内存时的错误(例如两次释放相同的内存垃圾)不会立即使系统崩溃,但可能导致转储更晚 - 特别是在分配新内存时。

你的情况很像我。

坏事是:

很难找到真正发生错误的地方 - 堆首先被破坏了。

这也可能是原因,为什么你的问题只会偶尔出现一次。它可能事先取决于一些复杂的情况。

答案 1 :(得分:1)

我相信你会检查明显的:wMsgLen> = 32