로그인

검색

조회 수 9855 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 게시글 수정 내역 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 게시글 수정 내역 댓글로 가기 인쇄

간단히 메모리 릭 발생여부를 알아내고 이를 해결하는 방법에 대해서 알아봅시다.

 

이는 MS 사에서 CRT(C Runtime) 라이브러리로 제공해는 CRTDBG 를 이용할 겁니다.

생각보다 쉬운 반면 그 기능은 막강하지요.

 

일단 프로그램 정의부에 다음과 같이 추가합니다.

#include <crtdbg.h>
#define CRTDBG_MAP_ALLOC
 
#ifdef _DEBUG
#define new new( _NORMAL_BLOCK, __FILE__, __LINE__ )        //궁금하시면 제 게시글 중 <매크로 마법> 편을 보세요.
#endif

 

이제 메인 진입 부 처음에 다음과 같이 선언합니다. 일반 main() 이라고 가정합니다. 물론 WinMain() 일 수도 있습니다.

void main() {
 
    _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
 
    //  .... 메모리를 동적 할당하는 무언가의 작업을 하겠죠
 
}

 

추가로 설명하자면, _CrtSetDbgFlag 설정 비트 필드 값은 다음과 같습니다.

 

_CRTDBG_ALLOC_MEM_DF : 디버그 힙 메모리 할당을 허용합니다. 또한 _CLIENT_BLOCK과 같은 사용자 정의 메모리 블럭을 사용합니다.

 

_CRTDBG_LEAK_CHECK_DF : 프로그램 종료 시 자동으로 메모리 릭을 찾고 이를 출력해 줍니다. 이는 _CrtDumpmemoryLeaks 함수를 호출한 것과 같은 결과입니다.

 

이제 프로그램을 디버그 모드로 실행하고 종료합니다. 만약 동적 메모리 해제를 제대로 안해줬다면 다음과 같은 결과가 결과 화면에 출력됩니다.

 

untitled_hermet.jpg?type=w2

 

우리에게 필요한 것은 바로 빨간색 선을 그은 정보입니다. 우리는 이 번호를 이용해 메모리 릭이 일어나는 부분을 찾아갈 수 있습니다.

그러나  중요한 점은 똑같은 환경에서 다시 실행했을 때도 메모리 릭 현상 결과가 같아야 한다는 점입니다. 그렇지 않으면, 매번 실행할 때마다 메모리 릭이 발생한 위치가 달라지고 따라서 위 번호도 달라져 버립니다.  따라서, 다른 작업을 하지 마시고 디버깅 작업만 하시길 바랍니다.

 

일단 위 9637 번호를 이용해서 메모리 릭이 일어나는 곳을 찾아가겠습니다. 이제 다시 main 첫부분에 다음과 같이 추가합니다.

void main() 
 
     _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
    _CrtSetBreakAlloc( 9637 );
 
    //  .... 메모리를 동적 할당하는 무언가의 작업을 하겠죠
 
}

그리고 다시 디버그 모드로 실행을 하면 9637에 지시하는 똑같은 메모리 번지를 알아서 브레이크 포인터를 걸어줍니다.

우리는 그 부분의 소스를 보고 콜 스택을 추적해 가면서 메모리 릭을 감지하고 해결할 수가 있죠.

 

이런식으로 출력창에 출력되었던 다른 메모리 릭도 모두 찾아 해결하시면 됩니다.

 

 

릴리즈 배포 전, 메모리 책임은 프로그래머의 미덕이지 않을까요?



http://blog.naver.com/hermet?Redirect=Log&logNo=54353236


근데 VS 2008은 이게 항상 동작하나보다.

디버그 모드 실행 -> 테스트 -> 프로그램 종료하면 메모리 릭 발생한 리스트가 output에 뜬다.

?

List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
공지 Tool/etc Programming 게시판 관련 2 MoA 2014.11.01 90129
35 모던 Node.js 패턴 (2025) OBG 2025.08.07 4148
34 LLM AI가 만든 코드, 결국엔 모두 레거시가 된다? OBG 2025.08.12 7115
33 LLM OpenAI의 gpt‑oss‑120b, gpt‑oss‑20b: 개인 컴퓨터에서 ChatGPT 사용? OBG 2025.08.12 7146
32 Omarchy, DHH가 만든 Linux 배포판 OBG 2025.08.12 6101
31 LLM ChatGPT가 7억 명을 서비스할 수 있는데, 나는 왜 GPT-4 하나도 로컬에서 못 돌릴까? OBG 2025.08.12 7175
30 LLM OpenAI의 새로운 오픈소스 모델은 사실상 Phi-5임 OBG 2025.08.12 6908
29 LLM Build a Small Language Model (SLM) From Scratch OBG 2025.08.16 15702
28 Agent Kimi K2 클로드 코드와 함께 사용하는 방법 OBG 2025.08.28 6000
27 Deeplearning I Want Everything Local — Building My Offline AI Workspace OBG 2025.08.28 15433
26 Agent Vibe Code an MVP Web App OBG 2025.08.28 5839
25 Agent 코딩 에이전트 만드는 법 OBG 2025.08.28 6395
24 Agent Claude Code를 최고의 설계 파트너로 만들기 OBG 2025.08.28 6193
23 LLM llama.cpp gpt-oss-120b 5090으로 돌려본 후기 OBG 2025.09.07 7064
22 LLM 구글 개발자가 말하는 나노바나나의 진짜 실체 OBG 2025.09.07 6772
21 LLM 나노바나나 공식 출시! 구글 제미나이에서 직접 사용하는 방법 OBG 2025.09.07 6960
20 Tool/etc VIM Master - Vim 명령어를 배우는 가벼운 브라우저 게임 OBG 2025.09.07 6858
19 Tool/etc Show GN: 유튜브 영상/웹페이지를 10초만에 구조화된 노트로 만드는 크롬 확장프로그램 OBG 2025.09.07 6891
18 Agent Spec Kit(Spec-Driven Development) OBG 2025.09.15 13342
17 Agent 초보를 위한 Claude Code 안내서 OBG 2025.09.15 5568
16 Web 알아두면 유익한 2019 개발이야기 OBG 2025.09.15 5511
Board Pagination Prev 1 ... 8 9 10 11 12 13 14 15 16 17 Next
/ 17