Принцип работы new
выражение-выделения — выражение, содержащее оператор new, — выполняет три действия:
Находит и резервирует хранилище для объекта или объектов, которым нужно выделить память. После завершения этого этапа выделен требуемый объем памяти, но это еще не объект.
Инициализирует объекты. После завершения инициализации имеется достаточно информации, чтобы выделенная память являлась объектом.
Возвращает для объектов указатель с типом, являющимся производным от имени-нового-типа или имени-типа. Программа использует этот указатель для доступа к новому объекту, которому выделена память.
Оператор new вызывает функцию operator new. Для массивов любого типа и для объектов, не имеющих типа class, struct или union, с целью выделения памяти вызывается глобальная функция ::operator new. Объекты типа класса могут определять собственную статическую функцию-член operator new на уровне класса.
Когда компилятор встречает оператор new для выделения памяти объекту типа type, он вызывает функцию 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.
В грамматике допускается указание необязательного параметра размещение (см. грамматику для оператора new). Параметр размещение может использоваться только для определяемых пользователем реализаций функции operator new; это позволяет передавать в функцию operator new дополнительные сведения. Выражение с полем размещение, например T *TObject = new ( 0x0040 ) T;, преобразуется в выражение T *TObject = T::operator new( sizeof( T ), 0x0040 );, если в классе T имеется член operator new, или в выражение, T *TObject = ::operator new( sizeof( T ), 0x0040 );, если такой член отсутствует.
Изначально поле размещение было введено, чтобы выделять аппаратно-зависимым объектам память по адресам, определенным пользователем.
Примечание
Хотя в предыдущем примере показан только один аргумент в поле размещение, не существует никаких ограничений на количество дополнительных аргументов, передаваемых в функцию operator new этим способом.
Даже если для типа класса определена функция operator new, приведенная в следующем примере форма позволяет использовать глобальный оператор.
T *TObject =::new TObject;
Оператор разрешения области действия (::) задает принудительное использование глобального оператора new.