2015-01-27 2 views
0

이전 버전의 Visual C++에서는 디버거가 메모리 누수를 감지 할 수있었습니다.VC 2012의 메모리 누수 감지

#define _CRTDBG_MAP_ALLOC 
#include <stdlib.h> 
#include <crtdbg.h> 

#include "stdafx.h" 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    char *memleak= new char[100]; 
    memleak[0]='a'; 
    return 0; 
} 

는 100 바이트의 memleak가 있다는 메시지가 표시해야 코드 다음 예 . 이와 같은 것 : (MSDN 참조)

감지 된 메모리 누수! 개체 덤프 -> {100} 길이가 0x00780E80 인 {18} 일반 블록. 데이터 : <> CD CD CD CD CD CD CD CD CD CD CD CD CD 오브젝트 덤프 완료.

하지만이 메시지를 "강제 적용"할 수 없습니다. 사용할 수있는 것이 있습니까? 또는 몇 가지 추가 기능을 설치해야합니까? Studio Prof. 2012 Update 4를 사용하고 있습니다.

답변

2

@Vinzenz의 대답은 다소 다르지만 모든 세부 사항을 알려 드리겠습니다. 기본적으로 두 가지 옵션이 있습니다. - 프로그램이 종료 될 때 디버그 런타임에 누수를 덤프 시키십시오 (_CRTDBG_LEAK_CHECK_DF 비트 값을 가진 플래그 값을 사용하여 _CrtSetDbgFlag을 호출하여 메모리 누수보고 기능을 켜거나) _CrtDumpMemoryLeaks()으로 호출하여 임의의 실행 지점에서 누수를 덤프하십시오. 당신의 모범이 이런 것들을하지 않기 때문에 아무 것도 얻지 못합니다.

_CrtDumpMemoryLeaks()은 소환되지 않은 힙 할당을 덤프 할 것이므로 훼손되지 않은 스마트 포인터 (및 힙 메모리를 할당하는 다른 모든 개체)는 삭제되지 않습니다. 이 시점에서 버려졌습니다. 그래서 보고서 플래그를 사용하는 것이 프로그램 실행이 끝난 후에 실행되므로 파괴되어야하는 모든 객체가 파괴되므로 더 유용합니다.

DBG_NEW의 경우 누출의 원인이 된 줄을 보여주는 추가 줄 정보 만 제공합니다. 그것 없이는 문제의 예제처럼 결과물을 얻게 될 것이고, 결과적으로이 문제의 원인이되는 행 번호를 얻게 될 것입니다 (아래 예 참조). 자세한 답변을

#define _CRTDBG_MAP_ALLOC 
#include <stdlib.h> 
#include <crtdbg.h> 

/* 

Without the DBG_NEW you get something like, no line info 

Detected memory leaks! 
Dumping objects -> 
{74} normal block at 0x00000000005D6520, 100 bytes long. 
Data: <    > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD 
Object dump complete 

With it you get 

Detected memory leaks! 
Dumping objects -> 
strcattest.cpp(36) : {74} normal block at 0x00000000002C6520, 100 bytes long. 
Data: <    > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD 
Object dump complete. 

*/ 

#ifdef _DEBUG 
#ifndef DBG_NEW 
#define DBG_NEW new (_NORMAL_BLOCK , __FILE__ , __LINE__) 
#define new DBG_NEW 
#endif 
#endif // _DEBUG 

int main(int argc, char* argv[]) 
{ 
    // Enable automatic memory leak reporting at the end of the program, the next 3 lines can be skipped if _CrtDumpMemoryLeaks() is called somewhere 
    int current_flags = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG); 
    current_flags |= _CRTDBG_LEAK_CHECK_DF; 
    _CrtSetDbgFlag(current_flags); 
    char *memleak= new char[100]; 
    _CrtDumpMemoryLeaks(); // Trigger dumping the leaks at this point 
    return 0; 
} 
+0

감사합니다 ... 는 이전 버전으로 작업 된 이유를 이제 궁금 해요 : -/ – nobs

+0

당신은 이전 버전에 의해 무엇을 의미합니까 @nobs? –

+0

VS 2005를 동일한 코드로 사용했습니다. 메시지가 있습니다. 무엇이 바뀌 었는지 모르겠지만 구 버전을 다시 파헤 치지 않을 것입니다. – nobs

1

해당 MSDN 기사를 읽었습니까? 당신은 메모리 할당에 대한 new을 사용하여, 당신은이 줄을 추가해야합니다 :

#ifdef _DEBUG 
    #ifndef DBG_NEW  
     #define DBG_NEW new (_NORMAL_BLOCK , __FILE__ , __LINE__) 
     #define new DBG_NEW 
    #endif 
#endif // _DEBUG 

또한 _CrtDumpMemoryLeaks()를 호출 할 수있는 프로그램의 어떤 지점에서 "힘"감지 된 모든 메모리 누수의 출력을합니다. 비록 내 애플 리케이션의 종료 지점에 이렇게하는 것을 선호합니다.

관련 문제