c++

[C++] 메모리누수와 해결방안

개발에대해 2025. 3. 24. 10:04
반응형

 

C++ 메모리 누수 원인과 해결 방법 총정리!

 

C++ 메모리 누수란?

메모리 누수(Memory Leak)는 프로그램이 동적으로 할당한 메모리를 해제하지 않아, 사용하지도 못하면서 시스템 자원을 계속 차지하는 현상입니다. 누적되면 프로그램의 성능 저하, 시스템 불안정, 심할 경우 크래시까지 유발할 수 있습니다.

 

메모리 누수가 발생하는 대표적인 상황

1. new로 할당하고 delete를 하지 않은 경우

int* ptr = new int(10);
// delete ptr; // 누락되면 메모리 누수 발생

2. 예외(Exception) 처리 중 delete 누락

void func() {
    int* data = new int[100];
    if (/* error condition */) {
        throw std::runtime_error("error");
        // delete data; 실행되지 않음
    }
    delete[] data;
}

해결: 스마트 포인터 사용 (std::unique_ptr, std::shared_ptr)

3. 복사 생성자 / 대입 연산자 미구현

사용자 정의 클래스에서 자원을 직접 관리하는 경우, 복사 생성자와 대입 연산자를 정의하지 않으면 얕은 복사로 인해 메모리 문제가 발생할 수 있습니다.

4. 외부 라이브러리에서 반환된 리소스를 직접 해제하지 않은 경우

예: Windows API, 타사 DLL 등에서 할당된 리소스를 FreeLibrary, CloseHandle, LocalFree 등으로 적절히 해제하지 않으면 리소스 누수 발생.

 

C++ 메모리 누수 해결 방법

1. 스마트 포인터 사용

#include <memory>
std::unique_ptr<int> ptr = std::make_unique<int>(10);

→ 자동으로 메모리 해제되므로 누수 방지

2. RAII (Resource Acquisition Is Initialization) 패턴 적용

→ 리소스는 객체 생성 시 획득, 소멸 시 자동 반납
→ 예: 파일 핸들, 소켓, 메모리 등 리소스 래핑 클래스 만들기

3. 정적 분석 도구 및 디버깅 툴 사용

  • Visual Studio의 메모리 진단 도구
  • Valgrind (Linux)
  • Dr. Memory
  • AddressSanitizer
_CrtDumpMemoryLeaks();  // Visual Studio 전용

4. 커스텀 메모리 할당/해제 추적 코드 작성

디버그 모드에서 new/delete 호출 로그를 출력하여, 누락된 delete를 추적할 수 있음.

 

🔍 팁

  • new/delete 보다는 스마트 포인터를 기본으로 사용하자.
  • 클래스에서 동적 메모리를 직접 다룰 경우, 반드시 Rule of Three or Rule of Five를 지켜야 한다.
  • 외부 DLL이나 API 사용 시, 리소스 해제를 꼭 문서로 확인하자.
  • 반복되는 누수가 있다면, 메모리 할당/해제 히스토리 로그를 남기는 것도 큰 도움이 된다.
반응형