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

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

fhan님의 프로필 이미지
fhan

작성한 질문수

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

Memory Pool #1

메모리풀 소멸자

작성

·

291

0

MemoryPool::~MemoryPool()

{

while (_queue.empty() == false)

{

MemoryHeader* header = _queue.front();

_queue.pop();

::free(header);

}

}

메모리풀이 소멸할때 메모리풀에 들어있는 포인터들에 할당된 데이터를 지우는 코드인것 같은데 포인터의 자료형이 MemoryHeader*으로 되있는데 free(header);를 할경우

MemoryHeader크기만큼 메모리 해제가 되는것 아닌가요? 아니면 저렇게해도 뒤에 데이터를 저장하기위해 할당받은 데이터까지 메모리 해제가 되나요?

답변 1

0

Rookiss님의 프로필 이미지
Rookiss
지식공유자

1)
C언어의 free는 void* 를 인자로 받습니다.
즉, 애당초 MemoryHeader* 를 넘겨준 것이 아닙니다.
따라서 포인터 타입을 이용해 메모리를 해제하는게 아니라,
힙 메모리 영역 헤더 쪽에 몇 바이트 크기의 메모리를 할당했는지를 남겨놓고
그 정보를 이용해 해제를 하게 됩니다.
실제로 malloc을 한 다음에, 메모리를 까봐서 할당한 바이트 수가 있는 것을 실습해보시기 바랍니다.

2)
이런 부분에 대한 궁금증을 갖는 것은 좋지만,
더 발전하려면 스스로 실습을 통해 답을 찾으셔야 더 많은걸 알 수 있습니다.
간단하게 malloc / free를 계속 실행해서 할당/해제하는 실습을 해보면서,
메모리 사용량이 증가되는지를 보면 정상적으로 삭제되는지 확인할 수 있겠죠.
실제로 stack_overflow 등 고수들이 즐비한 곳에 가보면
모든 것을 실험해서 그 결과를 기반으로 토론하는걸 알 수 있습니다.

fhan님의 프로필 이미지
fhan
질문자

네 감사합니다.  그런데 malloc free를 실험해보니 사용할때 따로 헤더부분을 붙여주지 않아도 할당해준 크기만큼 메모리 해제를 해주던데 헤더부분을 따로 붙여준 이유가 있을까요? 포인터가 큐에 들어가있는 상태면 allocsize가 0이니 해제해줄때 쓰이는게 아니고 포인터가 사용중일때 그 포인터가 몇바이트짜리 포인터pool의 포인터 인지 알기 위해 붙여준 것 인가요?

Rookiss님의 프로필 이미지
Rookiss
지식공유자

여러가지 이유가 있는데 그 중 주된 이유는 디버깅 용도입니다.
크기뿐 아니라 typeinfo 등 여러개 정보를 넣어서
혹시라도 메모리 오염이 발생하면 잡는데 큰 도움이 됩니다.

fhan님의 프로필 이미지
fhan
질문자

감사합니다^^

fhan님의 프로필 이미지
fhan

작성한 질문수

질문하기