我观察到应用程序发生崩溃,调用堆栈如下所示
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
这是完整的调用堆栈,我已经发布了原始消息中的代码片段
谢谢
最佳答案
我有一个可能会让您有点沮丧的建议:
CString::AllocBeforeWrite 确实向我暗示,系统尝试分配一些内存。
是否可能是其他一些内存操作(特别是释放或调整内存大小)之前已损坏?
C/C++ 内存管理的一个典型问题是,释放(或调整大小)内存时出现的错误(例如两次释放相同的垃圾内存)不会立即导致系统崩溃,但可能会导致稍后转储 --特别是当要分配新内存时。
我觉得你的情况很像。
坏处是:
很难找到真正发生错误的地方——堆首先被损坏的地方。
这也可能是您的问题偶尔出现一次的原因。这可能取决于事先的一些复杂情况。
关于c++ - CString 内崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1742282/