2009-11-16 3 views
2

Я наблюдаю сбой в моем приложении и стек вызовов показывает нижеКрушение в CString

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 

EDIT:

Call Stack:

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 

Ну это стек завершить вызов и я опубликовали фрагмент кода, как в моем первоначальном сообщении

Thanks

+0

Viswanathan это не очевидно из вашего фрагмента, как участвует класс CString. Является ли m_RawMessage экземпляром CString? – BostonLogan

+0

Если CParserN1000 :: iCheckMessage не является вашей процедурой потока, у вас есть поврежденный стек. Однако BaseThreadStart/_endthreadex/_AfxThreadEntry выглядит как законный стек. –

+0

ДЕЙСТВИТЕЛЬНО означает + = логическое значение? Код выглядит ошибочно несколькими способами ... – Goz

ответ

4

У меня есть предположение, что может быть немного расстраивает для вас:

CString :: AllocBeforeWrite ли впутывать мне, что система пытается выделить некоторую память.

Возможно, некоторая другая операция памяти (специально освобождающая или изменяющая размер памяти) повреждена раньше?

Типичная проблема с управлением памятью C/C++ заключается в том, что ошибка при освобождении (или изменении размера) памяти (например, в два раза освобождение одного и того же мусора памяти) не приведет к сбою системы немедленно, но может привести к дампам намного позже - - особенно когда необходимо выделить новую память.

Ваша ситуация очень похожа на меня.

Плохая вещь:

Это может быть очень трудно найти место, где происходит реальная ошибка - где куча испорченный в первую очередь.

Это также может быть причиной, почему ваша проблема возникает только раз в то время. Это может зависеть от некоторой сложной ситуации заранее.

+0

То, что вы сказали, вполне возможно. поэтому это делает мою работу еще более жесткой. хорошо, спасибо – ckv

1

Я уверен, что вы проверили очевидное: wMsgLen> = 32

+1

да, о котором заботятся – ckv