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를 사용