개발/코더 탈출
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을 사용하면 다음과 같은 문제가 발생합니다.
- 초기화 실패: 멤버 변수들이 쓰레기 값을 가집니다.
- 런타임 에러: 가상 함수 테이블(vtable)이 생성되지 않아 다형성(Virtual function) 사용 시 프로그램이 강제 종료됩니다.
- 자식 객체 누수: 클래스 멤버로
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