작성
·
93
1
안녕하세요. 강의를 보다가 질문이 생겨서 남깁니다.
강의 중간에 교수님께서 array에 할당된 메모리를 해제하기 위해 아래와 같이 쓰셨는데요. array에 할당된 배열의 크기를 어떻게 알고 해제하는건가요?
delete [] array;
답변 1
1
안녕하세요? 질문&답변 도우미 Soobak 입니다.
new[]
를 통해 동적 배열을 생성할 때, 컴파일러가 배열의 메모리 크기 정보를 별도의 메타데이터로 관리합니다.
예를 들어, 할당된 메모리의 앞 부분에 배열의 크기를 숨겨서 저장하거나, 별도의 힙 관리 테이블에 배열의 크기 정보를 저장한 후 각각 포인터와 연결하는 등의 관리 방식입니다.
관리하는 방식은 컴파일러(MSVS, GCC, 등) 마다 다를 수 있지만, C++ 표준에 의한 new[]
와 delete[]
의 기능을 지키면서, delete[]
가 배열의 크기를 참조하여 적절하게 메모리를 해제하게 됩니다.
개인적인 의견으로, 해당 부분에 관한 커뮤니티의 의견을 살펴보니 프로그래머가 delete[]
를 통해 동적 할당 배열을 할당할 때, 매번 해당 배열의 크기를 정확하게 인수로 넣어주는 것이 불편하고 불필요하다는 의견들이 많이 있네요. 심지어 메모리 할당을 해제할 때, 할당된 메모리의 크기는 프로그래머가 알 필요가 전혀 없는 정보라는 다소 과격하다 느껴지는 의견도 있네요.
저도 이러한 의견들에 일부 동의하며, 저는 delete[]
의 문법이 불필요하게 실수를 만들 가능성을 줄이기 위해 C 에서 발전된 C++ 의 재밌는 부분이 아닌가 생각합니다.
포인터와 메모리 관리의 중요성 및 실수 방지 등과 관련해서는 추후 섹션 16. 의미론적 이동과 스마트 포인터 에서 스마트 포인터와 함께 또 다시 학습하시게 되시며, 이후 조금 더 재미있는 관점으로 delete[]
에 대해서 바라보실 수 있으실 것 같습니다.
답변을 드리는 것에 참고한 자료 링크를 첨부드립니다.
https://stackoverflow.com/questions/197675/how-does-delete-know-the-size-of-the-operand-array