memory_new

memory_new (new 표현식 요약)

new-표현식은 동적 저장 기간을 가진 객체 또는 객체 배열을 생성하는 유일한 방법이에요. 즉 수명이 생성된 스코프에 제한되지 않는 객체를 만드는 방법이에요. new-표현식은 할당 함수를 호출해 저장 공간을 얻고, delete-표현식은 new-표현식이 만든 최상위 객체나 배열을 파괴하고 해제 함수를 호출해요.

출처: cppreference

본문

new-표현식은 동적 저장 기간을 가진 객체나 객체 배열을 생성하는 유일한 방법이에요. 즉 수명이 생성된 스코프에 제한되지 않아요. new-표현식은 할당 함수를 호출해 저장 공간을 얻어요. delete-표현식은 new-표현식이 만든 최상위(most derived) 객체나 배열을 파괴하고 해제 함수를 호출해요. 기본 할당·해제 함수와 그와 관련된 함수·타입·객체는 <new> 헤더에 선언되어 있어요.

주요 구성 요소

  • operator new/operator new[]: 메모리 할당 함수. new T가 호출해요.
  • operator delete/operator delete[]: 메모리 해제 함수. delete가 호출해요.
  • std::nothrow/std::nothrow_t: 던지지 않는 할당 오버로드를 위한 태그.
  • std::align_val_t: 과정렬 객체 할당 시 정렬 인자를 전달하는 타입.
  • std::bad_alloc, std::bad_array_new_length: 할당 실패·잘못된 배열 길이 예외.
  • std::new_handler/std::set_new_handler/std::get_new_handler: 할당 실패 시 호출되는 핸들러.
int* p = new int(42);       // operator new(4) 호출
delete p;                   // operator delete(p) 호출

int* a = new int[10];       // operator new[](40) 호출
delete[] a;                 // operator delete[](a)

int* q = new (std::nothrow) int(5);   // 실패 시 예외 대신 nullptr 가능

주의 (Notes)

new-표현식은 저장 공간을 얻는 것과 객체를 초기화하는 두 단계로 나뉘어요. new (placement) T 형태는 이미 확보된 저장 공간에 객체를 생성하는 placement new예요. 과할당(over-aligned) 타입은 C++17부터 정렬 인자를 전달받는 할당 함수가 선택돼요.

더 알아보기 (Learn more)

cppreference