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부터 정렬 인자를 전달받는 할당 함수가 선택돼요.