댕글링 포인터 (Dangling Pointer, 허상 포인터), 와일드 포인터 (Wild Pointer)

bokyungkim·2021년 8월 21일

할당된 메모리 영역을 가리키는 포인터가 있다. 그런데 메모리 영역이 해제된다면 어떻게 될까?

1. 댕글링 포인터란

해제된 메모리 영역을 가리키고 있는 포인터를 댕글링 포인터(Dangling Pointer, 허상 포인터)라고 한다. 동적 할당 된 포인터를 free하면 메모리 영역은 해제되지만 포인터는 삭제되지 않고 계속 남아있는 것이다.

예시

int *ptr = (int * )malloc(sizeof(int));
*ptr = 5;
printf("*ptr: %d\n", *ptr);
free(ptr); // ptr은 댕글링 포인터

2. 언제 문제가 되는가

  • 메모리 해제 후, 해제된 메모리에 접근할 때
  • 함수 호출에서 자동 변수를 가리키는 포인터를 반환할 때

예시

free(ptr);
*ptr = 10; // 오류 발생

3. 무슨 문제가 발생하는가

  • 메모리 접근시 (포인터 역참조 시) 예측 불가능한 동작
  • 메모리 접근 불가시 Segmentation fault (윈도우의 경우 general protection fault)
  • 잠재적인 보안 위험
  • 즉, 전체적인 프로그램 진행에 오류

4. 해결법

  • free 후 포인터를 NULL로 처리해준다.
free(ptr);
ptr = NULL;
  • 아래처럼 매크로 함수를 만들 수도 있다.
#define FREE(ptr) if(ptr) {free(ptr); ptr = NULL;}
  • 추후의 초기화 없이 포인터가 다시는 사용되지 않게 한다.

5. 와일드 포인터 (Wild pointer)

댕글링 포인터와 비슷한 경우로 와일드 포인터도 있다.

  • 첫 사용시 초기화를 생략함으로 인해 발생
  • 초기화가 강요되지 않는 언어의 모든 포인터는 와일드 포인터로 시작
  • 대부분 초기화의 생략이 아니라 초기화를 건너뛰어서 발생
  • 대부분의 컴파일러들은 이에 대해 경고할 수 있다




이상하게 댕글링 포인터 개념이 가끔 헷갈린다.
이제 확실하게 짚고 넘어가자!

📚 참고
https://thinkpro.tistory.com/67
http://itnovice1.blogspot.com/2019/10/c-dangling-pointer.html
https://ko.wikipedia.org/wiki/%ED%97%88%EC%83%81_%ED%8F%AC%EC%9D%B8%ED%84%B0#%EC%99%80%EC%9D%BC%EB%93%9C_%ED%8F%AC%EC%9D%B8%ED%84%B0%EC%9D%98_%EC%9B%90%EC%9D%B8

0개의 댓글