작성
·
291
0
MemoryPool::~MemoryPool()
{
while (_queue.empty() == false)
{
MemoryHeader* header = _queue.front();
_queue.pop();
::free(header);
}
}
메모리풀이 소멸할때 메모리풀에 들어있는 포인터들에 할당된 데이터를 지우는 코드인것 같은데 포인터의 자료형이 MemoryHeader*으로 되있는데 free(header);를 할경우
MemoryHeader크기만큼 메모리 해제가 되는것 아닌가요? 아니면 저렇게해도 뒤에 데이터를 저장하기위해 할당받은 데이터까지 메모리 해제가 되나요?
답변 1
0
1)
C언어의 free는 void* 를 인자로 받습니다.
즉, 애당초 MemoryHeader* 를 넘겨준 것이 아닙니다.
따라서 포인터 타입을 이용해 메모리를 해제하는게 아니라,
힙 메모리 영역 헤더 쪽에 몇 바이트 크기의 메모리를 할당했는지를 남겨놓고
그 정보를 이용해 해제를 하게 됩니다.
실제로 malloc을 한 다음에, 메모리를 까봐서 할당한 바이트 수가 있는 것을 실습해보시기 바랍니다.
2)
이런 부분에 대한 궁금증을 갖는 것은 좋지만,
더 발전하려면 스스로 실습을 통해 답을 찾으셔야 더 많은걸 알 수 있습니다.
간단하게 malloc / free를 계속 실행해서 할당/해제하는 실습을 해보면서,
메모리 사용량이 증가되는지를 보면 정상적으로 삭제되는지 확인할 수 있겠죠.
실제로 stack_overflow 등 고수들이 즐비한 곳에 가보면
모든 것을 실험해서 그 결과를 기반으로 토론하는걸 알 수 있습니다.
네 감사합니다. 그런데 malloc free를 실험해보니 사용할때 따로 헤더부분을 붙여주지 않아도 할당해준 크기만큼 메모리 해제를 해주던데 헤더부분을 따로 붙여준 이유가 있을까요? 포인터가 큐에 들어가있는 상태면 allocsize가 0이니 해제해줄때 쓰이는게 아니고 포인터가 사용중일때 그 포인터가 몇바이트짜리 포인터pool의 포인터 인지 알기 위해 붙여준 것 인가요?