'C/C++'에 해당되는 글 2건

  1. 2014.08.11 VC++ Check Memory Leak by _CrtSetDbgFlag
  2. 2014.08.08 sizeof(class) - virtual function

C++개발자에게 있어서 Memory Leak 은 민감한 문제중 하나이다.

auto_ptr등의 사용방법도 있으나 여기서는 Visual Studio C++에서 지원하는 _CrtSetDbgFlag란 녀석을 소개하고자 한다.

MSDN : http://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&l=KO-KR&k=k(%22CRTDBG%2f_CRTSETDBGFLAG%22);k(_CRTSETDBGFLAG);k(DevLang-%22C%2B%2B%22);k(TargetOS-WINDOWS)&rd=true

사용 예시)

정상적으로 int를 new/delete할때는 문제가 없으나 delete a; 항목을 주석처리 후 구동후 종료하면 VC 출력창에 아래와 같이 표시된다.

Detected memory leaks!

Dumping objects ->

{60} normal block at 0x006733D8, 4 bytes long.

 Data: <    > CD CD CD CD 

Object dump complete.

해석하면

60번째 생성된 0x006733D8주소(값 : 0xCD CD CD CD)의 4byte 길이의 메모리 누수가 발생했다.

이다.

그럼 60번째로 할당된 변수를 어떻게 찾지?

위 코드에서 주석 처리된 _CrtSetBreakAlloc()에 60이라는 값을 넣으면 구동시 해당 지점에서 VC에서 break를 걸어준다.

그러나 실제 개발시에는 memory leak이 아직 있다는 여부만 확인하는데 많이 쓰이며

누수가 발생한 위치를 찾는것은 처음에 고정적으로 생성되는 부분이 아닌경우가 많으며 대부분 매번 바뀌는 경우가 많다.


'C/C++' 카테고리의 다른 글

sizeof(class) - virtual function  (0) 2014.08.08
Posted by tlclover
,

아래 Class를 sizeof로 크기를 재보면 생각했던 것과 다르게 8byte로 측정된다.

변수는 4byte int만 있는데 왜 그런걸까?

 

그럼 변수값을 모두 없앤 아래 클래스는?

결과는 4byte다.

 

내가 모르는 4byte 주소값은 어떤값인 것일까?

실제 AClass의 메모리 번지(0x003afcb8)를 찾아보면 4byte의 주소값(0x00037834)과 int a 4byte(0x00000000)가 셋팅되어 있다. 

맨 앞 4byte 주소값은 virtual로 선언한 함수 목록을 가르키는 주소 번지임을 알 수 있다.

virtual 함수로 인한 상속시 dynamic binding을 위해서 별도 처리 공간을 잡는 것으로 생각된다.

'C/C++' 카테고리의 다른 글

VC++ Check Memory Leak by _CrtSetDbgFlag  (0) 2014.08.11
Posted by tlclover
,