C 포인터 이해와 활용 (2)

이동욱

2021/06/26

Categories: 프로그래밍

CHAP 02. 동적 메모리 관리

동적 메모리 할당


위 단계는 매우 일반적인 동적 메모리 할당 순서이다. 다음 예제에선 malloc 함수를 사용하여 정수를 저장할 메모리를 할당한다.

int *pi = (int*)malloc(sizeof(int));
*pi = 5;
printf("*pi: %d\n", *pi);
free(pi);

메모리 누수

char *chunk;

while (1) {
  chunk = (char*)malloc(10000000);
  printf("Allocating\n");
}

메모리 주소 손실

int *pi = (int*) malloc(sizeof(int));

*pi = 5;

pi = (int*) malloc(sizeof(int));
char *name = (char*) malloc(strlen("Susan") + 1);
strcpy(name, "Susan");

while (*name != 0) {
  printf("c", *name);
  name++;
}
함수 설명
malloc 힙에서 메모리 할당
realloc 기존 할당된 메모리의 크기 변경
calloc 힙에서 메모리 할당 그리고 0으로 설정
free 할당된 메모리를 힙으로 반환

정적 포인터 및 전역 포인터에 malloc 사용하기

static int *pi = (int*)malloc(sizeof(int));
static int *pi;
pi = malloc(sizeof(int));

힙 메모리와 시스템 메모리

댕글링 포인터 다루기

포인터가 원인인 문제들의 디버깅은 때로 해결하기 어려울 때가 있다. 댕글링 포인터 문제를 처리하기 위한 몇 가지 접근 방법이다.

  1. 메모리 해제 후 포인터를 NULL로 설정하라. NULL로 설정한 포인터를 그 이후에 사용하면, 애플리케이션이 종료될 것이다. 그러나 해당 포인터에 대한 다수의 복사본이 존재할 경우에는 문제는 여전히 발생한다.

  2. free 함수를 대체할 새로운 함수를 작성하라.

  3. 몇몇 런타임 시스템이나 디버깅 시스템은 해제된 메모리를 특별한 값으로 덮어쓴다. 예외가 발생하지 않은 상황이라도, 프로그래머는 예상치 못한 곳에 이러한 값이 포함된 것을 보고 프로그램이 해제된 메모리에 접근한 것을 알 수 있다.

  4. 댕글링 포인터와 다른 문제들을 발견하기 위한 서드 파티 도구들을 활용하라.

동적 메모리 할당 기술

참고 문헌

>> Home