본문 바로가기

[C/C++]댕글링 포인터 정리

Kwonriver 2022. 5. 19.
728x90

 

댕글링 포인터란?

댕글링 포인터(Dangling Pointer)란 이미 해제된 메모리 영역를 계속해서 가리키고 있는 포인터를 말하는 것으로 유효하지 않은 메모리를 가리키고 있기 때문에 Segmentation fault 가 발생할 수 있다.

 

int *pData = (int*)malloc(sizeof(int));
free(pData);
*pData = 10;	// 댕글링 포인터

위의 상황에서 free(pData); 이후 pData는 댕글링 포인터가 되었으며 *pData를 통해 10을 넣으려고 함과 동시에 Segmentation fault가 발생한다. 상황에 따라서 오류가 아닌 채 동작할 수 있으나 정상동작이 아니므로 버그의 원인이 된다.

 

int *pData1, *pData2;
pData1 = (int*)malloc(sizeof(int));
pData2 = pData1;

free(pData1);

*pData2 = 10;	// 댕글링 포인터

다른 상황으로 같은 메모리를 여러 포인터 변수가 가리키고 있을 때 하나를 해제 했으면 이미 메모리 영역은 해제가 되었으므로 해당 메모리를 가리키던 모든 포인터는 댕글링 포인터가 된다.

 

댕글링 포인터 발생을 막을 수 있는 방법은?

댕글링 포인터를 방지하는 방법은 메모리 해제 후 해당 포인터를 NULL 로 초기화 시켜주는 것이다.

 

#define NULL 0

int *pData = (int*)malloc(sizeof(int));
free(pData);
pDate = NULL;

*pData = 10;	// null pointer exception 발생으로 프로그램 다운

이렇게 NULL 또는 nullptr로 초기화하면 프로그램 동작 시 크래시가 나기 때문에 쉬이 수정이 가능하다.

매번 NULL 또는 nullptr 등을 대입하는 것이 불편하니 디파인을 만들어 free를 대체한다.

 

#define NULL 0
#define MEM_FREE(a) if( (a) != NULL ) free (a); (a) = NULL;

int *pData = (int*)malloc(sizeof(int));
MEM_FREE(pData);

*pData = 10;	// null pointer exception 발생으로 프로그램 다운

 

다만 이 방법은 여러 포인터가 하나의 메모리를 가리키는 상황에서 여전히 댕글링 포인터가 발생한다.

따라서 C++ 의 경우 스마트포인터를 사용하여 효과적인 메모리 누수 방지를 하거나 실제 레퍼런스 체크 기능을 추가해 방지한다.

 

728x90