인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

김민기님의 프로필 이미지
김민기

작성한 질문수

홍정모의 따라하며 배우는 C언어

12.16 calloc(), realloc()

free()함수의 정확한 용법 ( realloc함수와 free함수의 관계)

작성

·

447

0

 
해당 코드는 메모리 누수 강의에서 포인터를 백업하는 과정의 일부입니다. 제가 궁금한 것은 free()함수가 메모리를 반환한다는 개념이 아니라 그 내부의 메모리는 그대로 두돼, 사용하지 않는다의 개념이 가깝다고 들었습니다. 그렇다면 저 코드에서 free로 heap 메모리를 사용하지 못하게 하더라도 그대로 메모리 데이터 값이 나와야 하는 것이 아닌가요 ?
 
이와 상충되는 느낌을 realloc 강의에서 받았습니다.
다른 질문글을 보니 realloc()함수는 free()의 기능도 동시에 한다고 들었습니다
 
free()함수를 탑재하고 있는 realloc()함수를 이용했는데 해당 코드에서는 ptr[0]에 접근하여 데이터 값을 출력할 수 있습니다.
 
첫번째 사진 코드 대로라면은 free()는 아예 해당 메모리에
접근할 수 없는 것이고
두번째 사진 코드 대로라면은 free()는 접근은 가능하나 이용할 수
없습니다.
 
이 두 가지 개념이 혼동되어 질문드립니다.

답변 1

3

홍정모님의 프로필 이미지
홍정모
지식공유자

안녕하세요?

좋은 질문입니다. 꼼꼼하게 공부하고 계신 것 같네요. 

free() 함수는 운영체제에게 메모리를 반납하는 것이 맞습니다. 만약에 운영체제가 그 메모리를 다른 곳에 사용하지 않았다면 같은 주소에 같은 데이터가 계속 남아있는 것을 우연히 볼 수도 있겠지요. 그러나 어디까지나 free()를 한 후에 다시 그 메모리를 접근하는 것은 운영체제 입장에서는 무단침입입니다. 아침에 이사나간다고 집주인에게 열쇠까지 반납해놓고 저녁때 무단침입한 것과 같습니다.

메모리 관리는 운영체제의 주요 업무입니다. 우리가 만드는 프로그램은 모두 운영체제의 관리를 받으면서 작동합니다. 프로그래밍 언어의 문법은 운영체제가 어떻게 작동할 것이다까지 약속할 수 없습니다.

realloc()은 강의에서 설명을 드렸을 텐데 내부적으로 free()를 할 수도 있고 하지 않을 수도 있습니다. 이것도 결국 운영체제가 판단하는 것이기 때문에 프로그래밍 문법 차원에서 어떤 상황에서 결과가 어떻게 되어야 한다고 강제할 수 없습니다.

참고로 포인터는 주소라고 가르치기는 하는데 사실은 가상의 주소입니다. 따라서 메모리의 진짜 어디에 있는 지 조차 운영체제만 압니다. 메모리 관리를 운영체제가 어떻게 하는지 구체적인 내용에 대해서는 운영체제 과목의 영역이며 윈도우, 리눅스, 맥OS 등이 모두 다릅니다.

 

김민기님의 프로필 이미지
김민기
질문자

아하  그렇다면 realloc()함수는 운영체제 아래에서 유동적인 성격을 뛰는군요. 두번째 사진과 같은경우 해당 메모리에 접근이 가능했으니 free()가 쓰이지 않은 것이지요 ?? 그런데 교수님 realloc()함수가 운영체제 아래에서 어떤식으로 기능할지 모른다면 realloc()의 인자였던 포인터에 대해서는 마지막에 free()를 해주어야 하는것이 좋은가요? 정성스러운 답변 정말 감사합니다.

홍정모님의 프로필 이미지
홍정모
지식공유자

Realloc()이 성공했다면 유효한 주소를 받았겠지요 (공부용 예제 정도로는 항상 성공합니다) 그렇다면 당연히 다 사용한 후에는 free 해줘야합니다. Realloc 함수 설명을 검색해서 보시면 실패시에는 nullptr을 반환해준다고 하네요. 

김민기님의 프로필 이미지
김민기

작성한 질문수

질문하기