new 작동 방식
new 연산자가 포함된 식인 allocation-expression은 다음 세 가지 작업을 수행합니다.
할당할 개체에 대한 저장소를 찾고 예약합니다. 이 단계가 완료되면 올바른 양의 저장소가 할당되지만 아직 개체는 아닙니다.
개체를 초기화합니다. 초기화가 완료되면 할당된 저장소가 개체가 되는 데 충분한 정보가 있습니다.
new-type-name 또는 type-name에서 파생된 포인터 형식의 개체에 대한 포인터를 반환합니다. 프로그램에서는 이 포인터를 사용하여 새로 할당된 개체에 액세스합니다.
new 연산자는 operator new 함수를 호출합니다. 모든 형식의 배열과 class, struct 또는 union 형식이 아닌 개체의 경우, 전역 함수인 ::operator new가 저장소를 할당하기 위해 호출됩니다. 클래스 형식 개체는 클래스별로 고유한 operator new 정적 멤버 함수를 정의할 수 있습니다.
컴파일러에서는 type 형식의 개체를 할당하기 위한 new 연산자를 발견할 때 type**::operator new( sizeof(** type **) )**를 호출하거나, 사용자 정의 operator new가 정의되지 않은 경우 ::operator new( sizeof( type **) )**를 호출합니다. 따라서 new 연산자는 개체에 대한 올바른 양의 메모리를 할당할 수 있습니다.
참고
operator new에 대한 인수는 size_t 형식입니다.이 형식은 DIRECT.H, MALLOC.H, MEMORY.H, SEARCH.H, STDDEF.H, STDIO.H, STDLIB.H, STRING.H 및 TIME.H에서 정의됩니다.
문법에서 옵션을 사용하여 placement를 지정할 수 있습니다(new 연산자에 대한 문법 참조). placement 매개 변수는 operator new의 사용자 정의 구현에만 사용할 수 있습니다. 이 매개 변수를 사용하면 operator new에 추가 정보를 전달할 수 있습니다. T *TObject = new ( 0x0040 ) T;와 같은 placement 필드가 포함된 식은 T 클래스에 멤버 operator new가 있으면 T *TObject = T::operator new( sizeof( T ), 0x0040 );로 변환되고, 그렇지 않으면 T *TObject = ::operator new( sizeof( T ), 0x0040 );로 변환됩니다.
placement 필드의 원래 용도는 하드웨어 종속 개체가 사용자 지정 주소에서 할당될 수 있도록 하는 것입니다.
참고
위의 예제에서는 placement 필드에서 인수를 하나만 보여 주지만, 이런 식으로 operator new에 전달할 수 있는 추가 인수의 개수에는 제한이 없습니다.
operator new가 클래스 형식에 대해 정의되었더라도 다음 예제의 형태를 사용하여 전역 연산자를 사용할 수 있습니다.
T *TObject =::new TObject;
범위 결정 연산자(::)는 강제로 전역 new 연산자를 사용하도록 합니다.