Поделиться через


Принцип работы 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.

См. также

Ссылки

Оператор new (C++)