2010-07-08 8 views
1

내 C++ 응용 프로그램이 빡빡하고 메모리가 누출되지 않는다고 생각합니다. 장기 실행 스트레스 테스트와 정적 코드 분석기는 그만큼 많은 것으로 나타납니다. 그러나 Visual Studio 2008의 디버그 힙에 내장 된 매우 복잡한 사용법을 사용하면 종료시 다음과 같은 몇 가지 경고가 표시됩니다.디버깅 힙 메모리 누수 탐지 - 이상한 결과가 있습니까?

메모리 누수가 감지되었습니다!
덤핑 개체 ->
{318231} 일반 블록 0x03397FF8, 0 바이트 길이.
데이터 : <>

0 바이트 길이의 메모리 누수 란 무엇입니까? 어떻게 든 힙을 손상시킬 수 있습니까? 아마도 디버그 힙이 그런 경고를 내게 할 수 있습니까?

답변

2

괄호로 묶은 빈 값 다음에 나오는 "u"문자는 오싹합니다. 그러나 덤핑 코드의 버그로 설명 할 수있는 CRT 소스 코드를 보면 메모리 블록이 0 바이트 (dbgheap.c의 valbuff 변수) 인 경우 문자열을 0으로 종료하지 않는 것처럼 보입니다.

그렇지 않으면 0 바이트를 할당하는 것이 지원되는 시나리오입니다. 그리고 코드를 할당 해제하지 않은 코드는 아마도 어느정도 신비하지 않습니다. "정상적인 블록"출력이 안정되기 전에 숫자를 얻을 수 있다면 _crtBreakAlloc()을 초기화 코드에 할당하여 강제 중단 점을 지정할 수 있습니다. 또는 CRT 디버그 할당 자에 조건부 중단 점을 설정할 수 있습니다. 그것을 찾기 위해 malloc이나 새로운 호출로 추적하십시오.

+0

해답을 제공해 주셔서 감사합니다. 0 바이트를 할당하는 것이 실제로 유효한 시나리오라는 점을 지적 할 것입니다. 통찰력이 나를 올바른 길로 인도합니다. – BuschnicK

1

아아 (Argh. 신경 쓰지 마라. 나는 그것을 발견했다. 정적으로 링크 된 라이브러리는 new []를 통해 길이가 0 인 배열을 할당하고있었습니다. 이 경우에도 delete []를 사용하여 죽이는 것이 좋습니다. 그러나 삭제 호출은 조건부이며 배열 크기가 0보다 큰 경우에만 발생합니다.