반응형
아래와 같은 코드를 실행해보자.
#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 |
댓글