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
반응형
'C++' 카테고리의 다른 글
[코드트리 객체 정렬] 클래스를 이용한 객체 정렬 (0) | 2024.09.13 |
---|---|
[알고리즘] RMS, kurtosis (1) | 2024.01.03 |
[프로그래머스-코딩 기초 트레이닝 C++] 특별한 이차원 배열 2 (0) | 2023.07.20 |
[프로그래머스-코딩 기초 트레이닝 C++] 더 크게 합치기 (0) | 2023.07.20 |
패킷(RTU) 구조 만들기 예시 (0) | 2023.06.25 |