반응형
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 사용 시, 리소스 해제를 꼭 문서로 확인하자.
- 반복되는 누수가 있다면, 메모리 할당/해제 히스토리 로그를 남기는 것도 큰 도움이 된다.
반응형
'c++' 카테고리의 다른 글
Visual Studio C++ SendMessage 사용법 정리 (0) | 2025.09.18 |
---|---|
Visual Studio C++ PostMessage 사용법 정리 (0) | 2025.09.18 |
Visual Studio C++에서 libcurl로 JSON 요청/응답 처리하기 (0) | 2025.09.18 |
[C++] 메모리 누수 (1) | 2025.03.09 |
[c++] cmake 작성법 (0) | 2024.07.03 |