[C/C++]댕글링 포인터 정리
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
'[프로그래밍 공부] > C&C++' 카테고리의 다른 글
[C++] 레퍼런스 사용 시 주의 사항 (0) | 2023.01.27 |
---|---|
[C++] 함수 오버라이딩의 특수 케이스 (0) | 2023.01.09 |
[C++] decltype 이란? (0) | 2022.01.22 |
[C++] 왜 typedef 가 아닌 using을 사용해야 할까? (0) | 2022.01.22 |
[C++] enum class 사용하기 (0) | 2022.01.22 |