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

bokyungkim·2021년 8월 21일
0

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

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개의 댓글