작성
·
292
0
안녕하세요.
현재 따배씨 강의를 듣고있는 학생입니다.
free() 가 포인터가 가리키는 주소의 메모리를 반환하는 함수임은 알고 있으나 free()의 동작 원리에 대해 질문이 생겨서
내용을 작성합니다.
아래의 코드는 정상적으로 작동하지만, 중간에
//p++; 의 주석을 풀면 런타임 에러가 발생합니다.
p++ 을 해서 free(p);를 할 때 런타임 에러가 발생하는 이유가
1. malloc()을 할당받은 만큼 반환하여 할당받은 영역을 넘어선다.
2. 할당받은 공간의 시작주소를 보고 연결된 메모리 공간을 반환한다. (컴파일러가 중간에 이어진 주소를 보고 어떤 의미를 알지 못해서 일어나는 것? 이라고 생각)
제가 생각한 1번이나 2번에 있을까요?
항상 좋은 강의를 제공해주셔서 정말로 감사하고 있습니다.
코드
#include <stdio.h>
#include <stdlib.h>
int main()
{
int* p = (int *)malloc(sizeof(int) * 10);
if (!p)
{
printf("malloc() failed\n");
exit(EXIT_FAILURE);
}
// p++;
free(p);
printf("Success free\n");
}
답변 1
4
malloc으로 메모리를 동적으로 할당받으면 malloc은 그 힙 메모리의 '주소'를 리턴하죠.
운영체제는 이 주소에 할당한 힙 메모리의 '크기'를 내부적으로 기억하고 있는다고 합니다. 힙 메모리 영역의 "시작 주소"를 통해 할당받은 메모리 "크기"를 기억하고 있는다고 해요. (<C언어의 정석>이라는 책의 593 쪽을 참고했습니다.)
그래서 free 로 해제시켜줄 땐 얼마만큼 크기의 메모리를 해제시킬지 알려줄 필요 없이 그저 malloc으로부터 리턴 받았던 그 시작주소만 파라미터로 넘겨주면 되었던 것이죠!
따라서 p++ 해버린 후 변경된 p로 free 시키면 운영체제가 기억하지 못하는 주소이기 때문에 얼마만큼의 크기의 메모리를 해제할지에 대한 정보가 없어서 런타임 에러가 발생하는게 아닌가 싶습니다.
친절한 답변 감사드립니다!