개발/코더 탈출

C++ 메모리 관리 완벽 정리 2

-=HaeJuK=- 2026. 4. 29. 10:44
728x90
반응형

C++ 메모리 관리 정리

new/delete vs malloc/free, 그리고 프리 스토어(Free Store)의 비밀

1. new/delete와 malloc/free의 근본적인 차이

두 방식 모두 런타임에 힙(Heap) 영역에서 메모리를 할당받지만, 동작 방식에는 큰 차이가 있습니다.

비교 항목 malloc / free new / delete
성격 함수 (라이브러리) 연산자 (언어 기능)
생성자/소멸자 호출하지 않음 자동 호출 (핵심!)
반환 타입 void* (형변환 필요) 해당 타입의 포인터 (Safe)
실패 시 NULL 반환 예외(Exception) 발생

2. 힙(Heap)과 프리 스토어(Free Store)

질문하셨던 프리 스토어는 C++에서 new 연산자가 관리하는 논리적인 메모리 영역을 말합니다.

  • 힙(Heap): C 언어 시절부터 사용된 물리적인 메모리 덩어리 영역.
  • 프리 스토어(Free Store): C++ 표준에서 객체가 생성되고 소멸되는 장소를 지칭하는 추상적인 개념.

현대 컴파일러에서 대부분 프리 스토어는 힙 영역을 사용하여 구현되지만, new는 단순 할당을 넘어 생성자 호출이라는 종합적인 프로세스를 포함하는 개념입니다.

3. CLASS를 malloc으로 할당하면 안 되는 이유

클래스는 메모리 공간뿐만 아니라 데이터 초기화를 위한 생성자가 필수적입니다. malloc을 사용하면 다음과 같은 문제가 발생합니다.

  1. 초기화 실패: 멤버 변수들이 쓰레기 값을 가집니다.
  2. 런타임 에러: 가상 함수 테이블(vtable)이 생성되지 않아 다형성(Virtual function) 사용 시 프로그램이 강제 종료됩니다.
  3. 자식 객체 누수: 클래스 멤버로 std::string 등이 있을 때, 이들의 내부 메모리도 할당되지 않습니다.

4. 고급 기술: Placement New (배치 New)

이미 할당된 메모리(예: malloc으로 받은 영역)에 강제로 생성자를 호출하고 싶을 때 사용하는 유일한 방법입니다.

// 메모리만 먼저 확보 Knight* k = (Knight*)malloc(sizeof(Knight)); // 특정 주소(k)에 생성자만 강제로 실행 new(k) Knight(); // 사용 후 소멸자도 수동 호출해야 함 k->~Knight(); free(k);

5. 요약 및 결론

힙(Heap)이 아무것도 없는 빈 땅이라면, 프리 스토어(Free Store)는 그 땅 위에 집을 짓고 입주 교육까지 마친 완성된 주거 단지와 같습니다.

C++에서는 객체의 안전한 생명주기 관리를 위해 반드시 new/delete를 사용해야 하며, 특수한 성능 최적화가 필요한 경우에만 Placement New를 고려하는 것이 좋습니다.

728x90