본문 바로가기
개발/C, C++

허상 포인터 (Dangling Pointer)

by 피로물든딸기 2021. 7. 18.
반응형

C, C++ 전체 링크

 

아래와 같은 코드를 실행해보자.

#include <stdio.h>
#include <malloc.h>

void test()
{
	int* ptr = (int*)malloc(sizeof(int) * 10); /* heap 할당 */

	printf("address of ptr : %x\n", ptr);

	for (int i = 0; i < 10; i++) ptr[i] = i;
	for (int i = 0; i < 10; i++) printf("%d ", ptr[i]); putchar('\n');

	free(ptr);
	for (int i = 0; i < 10; i++) printf("%d ", ptr[i]); putchar('\n');

	for (int i = 0; i < 10; i++) ptr[i] = i;
	for (int i = 0; i < 10; i++) printf("%d ", ptr[i]); putchar('\n');

	printf("address of ptr : %x\n", ptr);
}

int main(void)
{
	test();

	return 0;
}

 

ptr에 int 10개의 메모리를 할당하였다.

그리고 free를 한 후, 메모리를 출력하면 garbage 값이 들어있는 것을 알 수 있다.

 

그런데 다시 ptr에 0 ~ 9까지 값을 넣어주고 출력하면 0 ~ 9가 출력되고, 

ptr도 기존에 할당된 메모리 cb760700으로 되어있다.

 

동적 할당된 포인터를 free로 해제해도 포인터가 여전히 남아있게 된다.

이러한 포인터를 허상 포인터, 댕글링 포인터(dangling pointer)라고 한다.

free(ptr);
printf("address of ptr : %x\n", ptr); /* <- dangling pointer */

 

free 후에 return을 하면 상관없지만, 만약 뒤에도 코드가 이어지고 ptr을 계속 참조하고 있다면 문제가 된다.

따라서 free 후에 NULL을 가르키도록 해서 해결한다.

#include <stdio.h>
#include <malloc.h>

void test()
{
	int* ptr = (int*)malloc(sizeof(int) * 10); /* heap 할당 */

	printf("address of ptr : %x\n", ptr);

	for (int i = 0; i < 10; i++) ptr[i] = i;
	for (int i = 0; i < 10; i++) printf("%d ", ptr[i]); putchar('\n');

	free(ptr);
	ptr = NULL;

	printf("address of ptr : %x\n", ptr);
}

int main(void)
{
	test();

	return 0;
}
반응형

'개발 > C, C++' 카테고리의 다른 글

C 언어에서 날짜 구하기  (2) 2021.07.24
C++ - 함수 템플릿 (Function Template)  (0) 2021.07.22
구조체의 크기  (0) 2021.06.19
C++ - 컨테이너와 반복자 (Container and Iterator)  (0) 2021.06.11
C++ - 인라인(inline) 함수  (0) 2021.05.19

댓글