해결된 질문
작성
·
182
0
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n = 10;
int* ptr = (int*)calloc(sizeof(int), n);
for (int i = 0; i < n; i++)
ptr[i] = i;
n = 30;
int* ptr2 = (int*)realloc(ptr, sizeof(int) * n);
printf("%p %p\n", ptr, ptr2);
for (int i = 0; i < n; i++)
printf("%d ", ptr[i]);
printf("\n");
for (int i = 0; i < n; i++)
printf("%d ", ptr2[i]);
free(ptr2);
ptr2 = NULL;
return 0;
}
안녕하십니까,,
int* ptr2 = (int*)realloc(ptr, sizeof(int) * n); 여기서realloc()함수가 sizeof(int)*30의 힙 메모리공간을 만들고 그 공간의 첫 번째 주소를 ptr2에 전달해주고 기존의 ptr이 가리키는 힙위치의 메모리를 free해준다고 아는데
for문을 통해 ptr[i]을 출력해봤더니 출력이 되네요ㅠ
ptr과 ptr2의 주소도 다르게 나오는데, realloc()함수가 기존의 ptr이 가리키는 메모리 공간을 free시켜준다고 배웠는데 제가 잘못 알고 있는걸까요??ㅠ
답변 2
0
0
안녕하세요
realloc 이 free 시켜주는 것 맞습니다.
free 라는 개념이 해당 메모리 공간을 깨끗하게 0으로 다 초기화 시켜주고 아예 없앤다는게 아니라 해당 메모리 공간이 사용중이지 않은 free 한 메모리 풀로 돌아간다는 의미에 가까운 것 같습니다. (그러니 free 후에도 그 전에 메모리를 썼던 상태 그대로 free 공간에 들어간다는 의미입니다.)
그래서 저렇게 free 시키더라도 해당 주소로 접근하여 값을 출력하는 행위를 하면 그 이전에 값이 출력 될 수 있어요. free 한다고 해서 막 초기화까지 다 시켜주고 접근도 못하게 막아버리고 그런건 아닌 것 같아요! 더군다나 해당 메모리는 개발자가 자유롭게 쓸 수 있는 힙 메모리다 보니.. 다만 해당 메모리 공간은 이제 free 한 공간이라고 운영체제에게 알려주는 행위인 것 같습니다.
int* ptr = (int*)malloc(sizeof(int) * 5);
ptr[0] = 3;
free(ptr);
ptr[0] = 2;
free 시켰기에 이제 해당 메모리는 사용자에게 allocate 되지 않은 공간임에도 저렇게 free 한 이후에 또 메모리에 접근하는게 에러가 나진 않았습니다. 다만, 메모리를 관리하는 주체인 운영체제 입장에선.. 저 ptr 이 free 한 공간이라고 알고 있기에, 뭔가 나중에 문제가 생길 소지가 있겠죠..?
링크 참고해보시면 도움 되실 것 같아요. https://stackoverflow.com/questions/15432123/using-pointer-after-free
Because freeing memory (a pointer) just puts back that memory on the free memory pool. The memory doesn't just disappear, and it's contents are not cleaned out till when that memory is allocated again and written to.