728x90
반응형
메모리 누수(Memory Leak)
- 컴퓨터 프로그램이 필요하지 않은 메모리를 계속 점유하고 있는 현상
- 더 이상 사용하지 않는 객체들이 힙(Heap) 영역에 남아있어 불필요하게 메모리를 차지하는 상황
메모리 라이프 사이클
- 메모리 할당 : 변수를 선언할 때나 객체, 배열 등을 생성할 때 메모리를 할당
- 메모리 사용 : 할당된 메모리를 읽거나 쓰는 단계(변수에 새로운 값을 할당하거나 객체의 속성을 읽을 떄 메모리 사용)
- 메모리 해제 : 객체가 더 이상 필요하지 않게 되면 메모리 해제코드 예시
char *a = malloc(20); // 포인터 변수 a에 동적 메모리 할당
char *b = malloc(10); // 포인터 변수 b에 동적 메모리 할당
b = a; // b가 가지고 있던 주소값을 a에 할당
free(a); // 포인터 a에 할당한 20바이트의 메모리를 해제
free(b); // 포인터 b에 할당한 10바이트의 메모리가 아닌 a에 할당한 20바이트 메모리 해제
// 포인터 b에 할당했던 10바이트 메모리가 할당 해제 될 수 없는 상태가 됨(memory leak 발생)
메모리 누수 예제
- 동적 메모리를 할당한 포인터 변수로 포인터 연산(e.g. 반복문)을 하여 동적 메모리를 할당한 메모리의 시작주소값이 아닌 상태에서 free를 하는 경우
c_ptr = malloc(10);
if (c_ptr == 0)
return (-1);
while (*c_ptr)
{
c_ptr++;
}
free(c_ptr);
- 동적 메모리 할당을 받은 포인터 변수가 free되지 않을 채 선언된 블록({})을 벗어난 경우
- 프로그램이 정상종료되기 전에 free(할당 해제)를 하지 않은 경우
- 프로그램이 에러에 따른 종료에 대비하여 종료 전 free(할당 해제) 조치를 하지 않은 경우
- 할당 해제를 하는 중간에 에러가 발생한 경우
메모리 누수를 피할 수 있는 좋은 습관
- malloc이나 calloc 함수를 쓰면 바로 free를 써놓고 코딩을 이어가기
char *str = (char*)malloc(n * sizeof(char)); // 코드
free(str);
- 동적 메모리 할당을 한 포인터를 직접 사용하지 않고, 임시 포인터 변수를 활용
int ptr = (int)malloc(sizeof(int));
int *temp = ptr;
free(ptr);
- 동적 메모리를 할당한 프로그램에서 오류나 예외처리로 바로 프로그램을 종료를 시키는 코드를 작성할 때, return 전에 할당한 메모리를 free해주는 것 잊지말고 작성
if (wirte(1, "42seoul", 7) == -1)
{
free(메모리);
return;
}
메모리 누수 방지 방법
- 할당과 해제의 균형 유지
동적으로 메모리를 할당한 후 반드시 해당 메모리를 더 이상 사용하지 않을 때 free 함수로 해제합니다.
할당과 해제를 균형 있게 유지하여 메모리 누수를 방지합니다. - 할당된 메모리의 라이프사이클 관리
메모리 할당과 해제는 해당 메모리의 라이프사이클에 따라 이루어져야 합니다.
함수나 블록의 범위 내에서 할당한 메모리는 해당 범위를 벗어나기 전에 해제해야 합니다. - 자동으로 해제하는 방법 사용
C 언어에서는 자동으로 메모리를 해제하는 방법도 제공됩니다.
예를 들어, 지역 변수나 스택을 활용하여 메모리 누수를 줄일 수 있습니다. - 메모리 할당과 해제 관련 함수 활용
C 언어에서는 메모리 할당과 해제를 보다 안전하고 효율적으로 관리하기 위한 함수들이 제공됩니다.
malloc 대신 calloc을 사용하거나, 문자열 복사 함수로 strdup을 활용하여 문자열 메모리를 자동으로 할당 및 해제할 수 있습니다. - 디버깅 도구 활용
메모리 누수를 탐지하기 위해 리눅스에서는 Valgrind와 같은 디버깅 도구를 활용할 수 있습니다.
이 도구는 프로그램 실행 중 메모리 누수를 실시간으로 모니터링하여 오류를 찾아줍니다. - goto문을 활용해 한 군데에서 메모리를 정리
C에서는 try-catch를 사용할 수 없지만 goto를 활용하면 try-catch와 유사한 효과를 볼 수 있습니다.
출처: [https://www.kernelpanic.kr/34]
(Mac OS)
- valgrind --leak-check=full ./실행파일명(Windows)
- Dr. Memory의 공식 웹사이트(https://drmemory.org/) 에서 최신 버전을 다운로드합니다.
(Windows)
- drmemory -logdir <출력_디렉토리> -- <프로그램_실행_명령어>
(drmemory -logdir C:\DrMemoryLogs -- my_program.exe)
메모리 프로파일러
- 메모리 사용영역을 탐지하고 객체별 사용 빈도와 데이터 라이프 사이클 같은 데이터를 자동으로 수집하는 툴(메모리 문제 분석 툴)
728x90
반응형
'크래프톤 정글 - TIL' 카테고리의 다른 글
크래프톤 정글 5기 TIL - Day 32 (0) | 2024.04.22 |
---|---|
크래프톤 정글 5기 TIL - Day 31(RB 트리 - 삽입, 삭제) (1) | 2024.04.19 |
크래프톤 정글 5기 TIL - Day 29(C언어 자료구조 - 이진 검색 트리) (0) | 2024.04.17 |
크래프톤 정글 5기 TIL - Day 28(C언어 자료구조 - 이진 트리) (0) | 2024.04.17 |
크래프톤 정글 5기 TIL - Day 27(C언어 자료구조 - 스택과 큐) (0) | 2024.04.15 |