C++ 环内碰撞

C++ 环内碰撞,c++,mfc,crash-dumps,C++,Mfc,Crash Dumps,我在应用程序中观察到一个崩溃,调用堆栈如下所示 mfc42u!CString::AllocBeforeWrite+5 mfc42u!CString::operator=+22 不知道为什么会这样。这种情况也不经常发生。 任何建议都会有帮助。我有一个崩溃的垃圾桶,但我不能再前进了 我正在做的手术是这样的 iParseErr += m_RawMessage[wMsgLen-32] != NC_SP; 其中m_RawMessage是512长度的字符数组。 wMsgLen为无符号短字符 N

我在应用程序中观察到一个崩溃,调用堆栈如下所示

mfc42u!CString::AllocBeforeWrite+5    
mfc42u!CString::operator=+22 
不知道为什么会这样。这种情况也不经常发生。 任何建议都会有帮助。我有一个崩溃的垃圾桶,但我不能再前进了

我正在做的手术是这样的

iParseErr += m_RawMessage[wMsgLen-32] != NC_SP;
其中m_RawMessage是512长度的字符数组。 wMsgLen为无符号短字符 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 
这是一个完整的调用堆栈,我已经发布了代码片段,和我的原始消息一样


谢谢

我相信你已经检查了显而易见的:wMsgLen>=32

我有一个建议可能会让你有点沮丧:

AllocBeforeWrite确实向我暗示,系统试图分配一些内存

有没有可能是其他内存操作(特别是释放内存或调整内存大小)以前被破坏了

C/C++内存管理的一个典型问题是,释放(或调整)内存的错误(例如,两次释放相同的内存垃圾)不会立即导致系统崩溃,但会在很久以后导致转储—特别是在分配新内存时

在我看来,你的处境很像那样

坏消息是:

很难找到真正错误发生的地方——堆首先损坏的地方


这也可能是你的问题偶尔发生一次的原因。这可能取决于之前的一些复杂情况。

Viswanathan从您的代码片段中不清楚CString类是如何参与进来的。m_RawMessage是CString的实例吗?如果CParserN1000::iCheckMessage不是线程过程,则堆栈已损坏。BaseThreadStart/\u endthreadex/\u AfxThreadEntry看起来像一个合法的堆栈。您真的想+=一个布尔值吗?代码在很多方面看起来都非常错误……您所说的是完全可能的。所以这让我的工作更加艰难。好的,谢谢