본문 바로가기
C++

[C++] 메모리누수(memory leak) 검사하는 방법

by 돌맹96 2023. 11. 8.
728x90
반응형

코딩을 하면서 메모리 누수에 대한 걱정을 많이 했다. 어디서 누수가 발생하고 있는게 아닐까? 내가 지금 잘짜고 있는걸까? 이런것들을 확인하기 위해서 검사하는 방법에 대해 알아보았다.

 

C++에서는 다들 아시다싶이 동적 메모리 할당이라는 것이 있다. 근데 이것을 제대로 해제(delete) 해주지 않으면 메모리 누수라는게 발생한다.

 

할당과 해제 방법은 다음과 같다.

// 생성방법
변수타입 변수명 = new 변수타입;
// 해제방법
delete 변수명;

//example
int a = new int;
delete a;

 

코드를 이런식으로 짜고 제대로 해제를 안해줬는데 일반적인 컴파일로는 확인 할 수가 없었다. 

 

메모리 누수 확인

컴파일에서 확인하기 위해서는 #define _CRTDBG_MAP_ALLOC _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);

_CrtDumpMemoryLeaks(); 이런 것들을 사용해야한다.

 

 

#include <iostream>
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
int main() {
    // 메모리 누수 감지를 활성화합니다.
    _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
    int* intArray = new int[100]; // 동적으로 100개의 정수 배열 할당
    // 할당된 메모리를 해제하지 않음으로써 메모리 누수 발생
    std::cout << "Memory leak example" << std::endl;
    // 프로그램 종료 전 메모리 누수를 강제로 확인합니다.
    _CrtDumpMemoryLeaks();
    return 0;
}

 

이런식으로 코드를 작성하게되면 아래와 같이 메모리 누수가 발생하는 위치를 알 수 있게 된다.

{160} normal block at 0x00E91110, 400 bytes long이라는 문구를 볼 수 있는데 이 위치를 기억해서 아래와 같이 코딩을 하면 메모리 누수가 발생하는 변수를 찾을 수 있다.

#include <iostream>
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
int main() {
    _CrtSetBreakAlloc(160);
    _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
    int* intArray = new int[100]; // 동적으로 100개의 정수 배열 할당
    // 할당된 메모리를 해제하지 않음으로써 메모리 누수 발생
    std::cout << "Memory leak example" << std::endl;
    // 프로그램 종료 전 메모리 누수를 강제로 확인합니다.
    _CrtDumpMemoryLeaks();
    
    return 0;
}

빌드를 하게되면

메모리 누수가 발생하는 지점을 알려준다.

728x90
반응형