C 동적할당 어째서 free() 로 해제한 메모리를 수정하거나 접근할수 있는건가요?
조회수 782회
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int *pList = NULL, i = 0;
pList = (int*)malloc(sizeof(int) * 3);
pList[0] = 10;
pList[1] = 20;
pList[2] = 30;
for(i=0; i <3; ++i) {
printf("%d\n", pList[i]);
}
free(pList);
printf('\n ********** \n');
pList[0] = 10;
pList[1] = 20;
pList[2] = 30;
for(i=0; i <3; ++i) {
printf("%d\n", pList[i]);
}
return 0;
}
이번에 동적할당 공부하면서 궁금한게 생겼는데요.
여기 free() 에서 동적할당을한 메모리를 해제해서 운영체제에 돌려준다고 설명이 나와있던데
어떻게 해제한 후에도 그 값을 수정하거나 접근할수 있는건가요?
해제했다면 아예 그값에 접근하지 못하거나 없어야 하지 않나요??
-
(•́ ✖ •̀)
알 수 없는 사용자 - 〉
2 답변
-
malloc으로 메모리를 할당 받았다가 free로 해제하는데요.
예를 들어, malloc으로 10바이트를 할당 받았는데, 이 때, 다시 한번 malloc으로 20바이트를 할당 받으면 두 메모리는 겹치지 않습니다.
그런데 만약 malloc으로 10바이트를 먼저 할당 받고, 그 후 free로 그 메모리를 해제한 후, 다시 malloc으로 메모리를 할당 받으면 이 경우에는 방금 전 free로 해제한 메모리의 일부 또는 전부를 할당 받을 수도 있습니다.
결국 free는 다시 malloc으로 할당 받을 수 있게 해제하는 역할이라고 생각하시면 됩니다.
보통 운영체제 같은 과목에서 프로세스 이미지라는 것을 배울수 있는데요. malloc 함수가 할당 받는 메모리는 프로세스 이미지 중의 힙 영역의 메모리입니다.
질문 코드에서 보면
free(pList); pList[0] = 10;
해제 했는데도 불구하고 읽을 수 있는 것은 물론, 심지어는 변경도 가능하네요.
그래서 보통 free를 사용한 후에 NULL을 입력합니다.
free(pList); pList=NULL;
그러면 더이상
pList[0] = 10;
는 동작하지 않게 되겠지요.-
(•́ ✖ •̀)
알 수 없는 사용자
- free()를 사용하고 다시 그 영역의 메모리의 값을 수정하면 나중에 문제가 발생할까요? 당장 에러는 안나기는 해서.. ㅠ 알 수 없는 사용자 2020.9.2 20:00
- 발생할 수 있습니다. 알 수 없는 사용자 2020.9.2 21:02
- 답변 감사함니다!!!! >ㅡ< 알 수 없는 사용자 2020.9.2 21:21
-
-
댓글 입력