C/C++에서 배열, 구조체, 클래스 등 다양한 데이터를 동적으로 할당하려면 "동적 메모리 할당"이 필요합니다. 포인터와 함께 쓰이며, 정적(static) 메모리 할당과는 달리 런타임 시 메모리를 직접 관리할 수 있는 강력한 도구입니다.
이번 글에서는 동적 할당의 개념, malloc과 new의 차이, 그리고 할당/해제 방법과 주의사항까지 정리해보자.
| 항목 | 정적 메모리 | 동적 메모리 |
|---|---|---|
| 할당 시점 | 컴파일 시 | 실행 시 |
| 크기 변경 | 불가능 | 가능 |
| 예시 | int arr[100]; | int* arr = new int[n]; |
| 해제 | 자동 | 수동 (delete, free) |
배열 크기를 실행 중에 결정해야 할 때
큰 데이터 구조(트리, 그래프 등)를 유연하게 생성할 때
함수에서 만든 데이터를 반환할 때
리소스를 명확하게 제어하고 싶을 때
#include <cstdlib> // malloc, free
int* arr = (int*)malloc(sizeof(int) * 5); // int 5개 공간 할당
if (arr == NULL) {
// 메모리 부족 등 예외 처리
}
arr[0] = 10;
free(arr); // 메모리 해제
malloc(size_t size): 바이트 단위로 메모리 블록을 할당
free(ptr): malloc 등으로 할당한 메모리 해제
int* arr = new int[5]; // int 5개 공간 할당
arr[0] = 10;
delete[] arr; // 배열일 경우 delete[]
int* a = new int;
*a = 42;
delete a;
| 항목 | malloc / free | new / delete |
|---|---|---|
| 언어 | C / C++ | C++ 전용 |
| 타입 캐스팅 | 필요 ((int*)) | 불필요 |
| 생성자 호출 | X | O (객체 생성 시) |
| 예외 처리 | NULL 반환 | 예외(throw) 발생 |
| 할당 방식 | 함수 | 연산자(Operator) |
| C++에서는 가능하면 new/delete를 사용하자
new/delete, malloc/free는 반드시 쌍으로 사용
해제하지 않으면 메모리 누수(memory leak) 발생
해제 후에는 포인터를 nullptr로 바꾸는 습관 권장
이미 해제된 메모리를 또 해제하거나 접근하면 undefined behavior
void leak() {
int* p = new int[100]; // 할당
// delete[] p; // 해제 안함 → 메모리 누수
}
→ 이런 문제가 쌓이면 프로그램이 느려지거나, 종료됨.