Development/Native C, C++
동적 할당 (Dynamic Allocation)
likepint
2025. 4. 28. 17:23
동적 할당(Dynamic Allocation)
- 런타임(프로그램 실행 중)에 필요한 메모리를 할당하는 것
- 정적 메모리(컴파일 타임)와 대비되는 개념으로 주로 힙(heap) 영역에 메모리를 할당
✅ 동적 할당을 사용하는 이유?
• 배열이나 객체의 크기를 미리 알 수 없을 때
• 런타임에 메모리 크기가 유동적으로 변할 때
• 객체 수명을 직접 제어하고 싶을 때
malloc vs. new
구분 | malloc | new |
정의 | C언어 스타일의 메모리 할당 함수 | C++ 스타일의 메모리 할당 연산자 |
헤더 | <cstdlib> 필요 | 내장 키워드라 별도 헤더 불필요 |
반환형 | void* (형 변환 필요) | 타입에 맞는 포인터 반환 (형변환 불필요) |
목적 | 단순 메모리 블록 할당 | 객체 생성 + 생성자 호출 |
malloc
#include <cstdlib> // malloc, free 사용
int* p = (int*)malloc(sizeof(int) * 5); // int 5개 동적 할당
if (p != nullptr)
{
p[0] = 1;
p[1] = 2;
}
free(p); // 해제
- malloc은 반환 타입이 void*이므로 형 변환(casting) 필요
- 메모리만 확보할 뿐, 생성자 호출이 일어나지 않음
new
int* p = new int[5]; // int 5개 동적 할당
p[0] = 1;
p[1] = 2;
delete[] p; // 해제
- new 형변환이 필요 없음
- 객체 생성 시 자동으로 생성자 호출(필요 시)
항목 | malloc | new |
---|---|---|
메모리 할당 목적 | 메모리 블록만 확보 | 객체 생성 및 생성자 호출 |
반환 타입 | void* (형변환 필요) | 자동 타입 지정 (형변환 불필요) |
실패 처리 | NULL 반환 | std::bad_alloc 예외 발생 |
초기화 | 초기화 안 함 | 초기화 가능 |
해제 방식 | free() | delete / delete[] |
배열 지원 | 명시적 크기 계산 | new[] 지원 |
헤더 파일 | <cstdlib> | 필요 없음 (내장) |
메모리 실패 처리
int* p = (int*)malloc(sizeof(int));
if (p == NULL)
{
// 실패 처리
}
- malloc은 실패 시 NULL 반환 (매번 null 체크 필요)
try
{
int* p = new int;
}
catch (std::bad_alloc& e)
{
std::cout << "메모리 할당 실패: " << e.what() << std::endl;
}
- new는 실패 시 기본적으로 std::bad_alloc 예외를 던짐
클래스 동적 할당 시 주의할 점
class MyClass
{
public:
MyClass()
{
std::cout << "Constructor Called" << std::endl;
}
};
MyClass* obj = new MyClass(); // 생성자 호출 OK
// MyClass* obj = (MyClass*)malloc(sizeof(MyClass)); // ❌ 생성자 호출 안 됨 → 문제 발생
✅ 클래스 객체를 malloc으로 생성하면 생성자가 호출되지 않기 때문에 C++에서는 new를 사용