[C언어] 댕글링 포인터(dangling pointer)

[C언어] 댕글링 포인터(dangling pointer)

댕글링 포인터 (dangling pointer)

현수 포인터, 고아 포인터 등

동적 할당(힙 할당)에서 메모리가 해제 된 곳을 가리키고 있는 포인터
댕글링 포인터란, 이미 메모리에서 해제된 대상을 가리키고 있는 포인터를 말함

발생되는 원인은 동적으로 할당 받은 메모리가 해제되었는데도 포인터 변수가 해제된 메모리 주소를 가지고 있기 때문이다.

이를 방지하기 위해서는 메모리 해제 이후에 반드시 포인터 변수에 NULL값으로 초기화 해준다.
  • 동적 할당 : 힙 영역에 변수를 할당하는 일
  • 힙 영역 : c언어의 메모리 분할 영역 중 하나로 사용자가 직접 변수를 할당/삭제를 관리하는 영역


발생하는 이유 

동적 할당된 포인터를 free함수로 해제한 후에도 포인터는 삭제되지 않고 계속 남아있기 때문에

ex) 
char* ptr = (char*)malloc(sizeof(char)*5); //힙 할당
... //ptr 포인터의 사용
free(ptr); //메모리 해제
위의 예에서 free함수에 의해 ptr이 가리키는 메모리는 해제되었지만, ptr은 삭제되지 않고 그대로 메모리가 해제된 지역을 가리킨다. 여기서 ptr은 댕글링 포인터가 된다.


발생하는 문제

만약 실수로 댕글링 포인터를 사용하면 심각한 오류가 발생해 전체적인 프로그래밍 진행에 오류가 남



해결법

동적할당된 포인터 ptr을 매개변수로 받는다.
ptr이 NULL 포인터인지 아닌지 검사한다.
ptr이 가리키는 힙 메모리를 해제한다.
ptr에 NULL을 대입한다.
#define FREE(ptr) if(ptr) { free(ptr); ptr =NULL;} // 안전한 메모리 해제를 위한 매크로 함수


출처

댓글

이 블로그의 인기 게시물

[Python] # -*- coding: utf-8 -*-를 쓰는 이유

[소프트웨어공학] NS(Nassi-Schneiderman) 차트

[컴퓨터네트워크] Telnet이란?