오늘 수업은 다음과 같은 질문으로 시작한다.
배열 형태의 힙메모리를 할당 한 후 해제할 때 어떻게 free는 배열의 시작 주소만 받고 배열 메모리를 해제할 수 있을까?
free는 어떻게 배열 형태의 메모리를 해제하는 것일까?
char* p = (char*)malloc(sizeof(char) * 2);
free(p);
p에 저장된 것은 할당된 메모리의 첫 번째 주소일텐데 어떻게 배열 전체를 해제할 수 있는걸까? 스택오버플로우에서부터 비슷한 질문을 들고왔다.
그리고 이 질문에 대한 답변이다.
malloc() 함수를 사용할 때 배열 크기보다 조금 더 많은 정보의 데이터 메모리가 할당되는데 이 곳에 배열의 크기가 저장된다. 그리고 free() 함수는 이곳에 저장된 배열의 크기를 보고 그 크기만큼의 메모리를 해제하는 것이다.
그러면 new연산자는?
char* p = new char[2];
delete[] p;
delete 연산자에 "[]"기호를 추가해 배열 전체를 해제한다.
왜 new는 "[]"를 필요로 할까?
이 질문에 대한 답도 스택오버플로우에서 찾을 수 있었다.
new 연산자를 배열형태로 할당하는 것을 예상하지 못해 고려되지 않았다고 한다.