티스토리 뷰

c++

[C++] 메모리 누수

개발에대해 2025. 3. 9. 20:16
반응형

 

 

C++에서 메모리 누수를 찾아내는 방법

메모리 누수(memory leak)는 동적으로 할당한 메모리를 해제하지 않아 발생하는 문제로, 장기적으로 프로그램의 성능을 저하시킬 수 있습니다. 특히, C++과 같은 언어에서는 개발자가 메모리 관리를 직접 수행해야 하기 때문에 메모리 누수를 찾아내고 해결하는 것이 중요합니다. 

1. 메모리 누수란?

메모리 누수는 프로그램이 더 이상 필요하지 않은 메모리를 해제하지 않아서 발생하는 문제입니다.

이는 장기간 실행되는 프로그램에서 심각한 문제를 초래할 수 있으며, 시스템 리소스를 낭비하게 됩니다.

발생 원인

  • new 또는 malloc()으로 할당한 메모리를 delete 또는 free()로 해제하지 않음
  • 예외(exception) 발생 시 메모리 해제 코드가 실행되지 않음
  • 전역 또는 정적 객체의 메모리가 해제되지 않음

2. 메모리 누수를 찾는 방법

1) 수동 디버깅을 통한 확인

  • 코드 리뷰를 통해 newmalloc()으로 할당한 후 delete 또는 free()를 호출하는지 확인합니다.
  • RAII(Resource Acquisition Is Initialization) 패턴을 사용하여 스마트 포인터(std::unique_ptr, std::shared_ptr)를 활용하면 메모리 관리를 자동화할 수 있습니다.

2) 디버거 활용

Visual Studio의 메모리 누수 검사 기능


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

int main() {
    int* leak = new int[10]; // 메모리 누수 발생
    _CrtDumpMemoryLeaks(); // 종료 시 메모리 누수 감지
    return 0;
}
    

gdb 및 Valgrind 사용 (Linux)


valgrind --leak-check=full ./your_program
    

이 명령어를 실행하면 누수된 메모리 주소와 함께 어떤 부분에서 문제가 발생했는지 확인할 수 있습니다.

3) AddressSanitizer 활용

최신 컴파일러(Clang, GCC)에서 AddressSanitizer를 사용하면 실행 시 메모리 문제를 감지할 수 있습니다.


g++ -fsanitize=address -g -o my_program my_program.cpp
./my_program
    

이를 통해 메모리 누수를 포함한 여러 메모리 관련 오류를 확인할 수 있습니다.

3. 메모리 누수 방지 방법

1) 스마트 포인터 사용


#include <memory>
int main() {
    std::unique_ptr<int[]> arr = std::make_unique<int[]>(10);
    return 0; // 자동으로 메모리 해제됨
}
    

2) RAII 패턴 활용


class Resource {
    int* data;
public:
    Resource() { data = new int[100]; }
    ~Resource() { delete[] data; }
};
    

3) 메모리 누수 탐지 도구 정기적 활용

Valgrind, AddressSanitizer 등의 도구를 개발 주기에 포함하여 지속적으로 검사하는 것이 중요합니다.

 

'c++' 카테고리의 다른 글

[C++] 메모리누수와 해결방안  (0) 2025.03.24
[c++] cmake 작성법  (0) 2024.07.03