작성
·
445
0
답변 1
3
안녕하세요?
좋은 질문입니다. 꼼꼼하게 공부하고 계신 것 같네요.
free() 함수는 운영체제에게 메모리를 반납하는 것이 맞습니다. 만약에 운영체제가 그 메모리를 다른 곳에 사용하지 않았다면 같은 주소에 같은 데이터가 계속 남아있는 것을 우연히 볼 수도 있겠지요. 그러나 어디까지나 free()를 한 후에 다시 그 메모리를 접근하는 것은 운영체제 입장에서는 무단침입입니다. 아침에 이사나간다고 집주인에게 열쇠까지 반납해놓고 저녁때 무단침입한 것과 같습니다.
메모리 관리는 운영체제의 주요 업무입니다. 우리가 만드는 프로그램은 모두 운영체제의 관리를 받으면서 작동합니다. 프로그래밍 언어의 문법은 운영체제가 어떻게 작동할 것이다까지 약속할 수 없습니다.
realloc()은 강의에서 설명을 드렸을 텐데 내부적으로 free()를 할 수도 있고 하지 않을 수도 있습니다. 이것도 결국 운영체제가 판단하는 것이기 때문에 프로그래밍 문법 차원에서 어떤 상황에서 결과가 어떻게 되어야 한다고 강제할 수 없습니다.
참고로 포인터는 주소라고 가르치기는 하는데 사실은 가상의 주소입니다. 따라서 메모리의 진짜 어디에 있는 지 조차 운영체제만 압니다. 메모리 관리를 운영체제가 어떻게 하는지 구체적인 내용에 대해서는 운영체제 과목의 영역이며 윈도우, 리눅스, 맥OS 등이 모두 다릅니다.
Realloc()이 성공했다면 유효한 주소를 받았겠지요 (공부용 예제 정도로는 항상 성공합니다) 그렇다면 당연히 다 사용한 후에는 free 해줘야합니다. Realloc 함수 설명을 검색해서 보시면 실패시에는 nullptr을 반환해준다고 하네요.
아하 그렇다면 realloc()함수는 운영체제 아래에서 유동적인 성격을 뛰는군요. 두번째 사진과 같은경우 해당 메모리에 접근이 가능했으니 free()가 쓰이지 않은 것이지요 ?? 그런데 교수님 realloc()함수가 운영체제 아래에서 어떤식으로 기능할지 모른다면 realloc()의 인자였던 포인터에 대해서는 마지막에 free()를 해주어야 하는것이 좋은가요? 정성스러운 답변 정말 감사합니다.