문제
응용 프로그램 내에서 충돌을 관찰하고 있으며 아래의 통화 스택 쇼가 아래에 표시됩니다.
mfc42u!CString::AllocBeforeWrite+5
mfc42u!CString::operator=+22
이것이 왜 발생하는지 모르겠습니다. 이것은 자주 발생하지 않습니다. 모든 제안이 도움이 될 것입니다. 나는 나와 함께 충돌 덤프가 있지만 더 이상 진행할 수는 없습니다.
내가 수행하는 작업은 이와 같은 것입니다
iParseErr += m_RawMessage[wMsgLen-32] != NC_SP;
여기서 M_RAWMESSAGE는 512 길이 Char 어레이입니다. 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 ++ 메모리 관리의 일반적인 문제는 메모리를 자유롭게 (또는 크기 조정하는) 오류 (예 : 동일한 메모리 정크를 두 번 자유롭게하는 것)에 대한 오류가 시스템에 즉시 충돌하지 않지만 특히 새로운 경우 덤프를 일으킬 수 있다는 것입니다. 메모리는 할당됩니다.
당신의 상황은 저에게 아주 좋아 보입니다.
나쁜 점은 다음과 같습니다.
실제 오류가 발생하는 장소를 찾기가 매우 어려울 수 있습니다. 힙이 처음에 손상된 곳.
이것은 또한 당신의 문제가 가끔만 발생하는 이유 일 수 있습니다. 사전에 복잡한 상황에 의존 할 수 있습니다.
다른 팁
나는 당신이 명백한 것을 확인했을 것이라고 확신합니다 : wmsglen> = 32