Учебник по C++, 5-е издание, новое размещение

Насколько я знаю, размещение new не выделяет память, а представляет собой форму оператора new, который берет указатель на уже выделенную память и создает там объект.

Но меня так смущает этот текст из 5-го издания учебника по С++:

Вместо этого мы используем форму размещения new от new (§ 12.1.2, стр. 460) для создания объекта. Как мы видели, эта форма new предоставляет дополнительную информацию для функции распределения. Мы можем использовать размещение new для передачи адреса, и в этом случае новое выражение размещения имеет вид

new (place_address) type
new (place_address) type (initializers)
new (place_address) type [size]
new (place_address) type [size] { braced initializer list }

где place_address должен быть указателем, а инициализаторы предоставляют (возможно, пустой) список инициализаторов, разделенных запятыми, для использования для создания вновь выделенного объекта.

При вызове с адресом и без других аргументов размещение new использует оператор new(size_t, void*) для «выделения» своей памяти. Это версия оператора new, которую нам не разрешено переопределять (§ 19.1.1, стр. 822). Эта функция не выделяет никакой памяти; он просто возвращает аргумент-указатель. Затем общее новое выражение завершает свою работу, инициализируя объект по заданному адресу. По сути, размещение new позволяет нам создать объект по определенному заранее выделенному адресу памяти.

Примечание

При передаче одного аргумента, который является указателем, новое выражение размещения создает объект, но не выделяет память.

Что это означает. При вызове с адресом и без других аргументов размещение new использует оператор new(size_t, void*) для «выделения» своей памяти.? Означает ли это размещение новых вызовов функции для выделения памяти?

  • Также в примечании говорится, что когда при размещении new передается один аргумент, который является указателем, он создает объект, но не выделяет память: означает ли это, что если передано более одного аргумента, он может выделить память?

Может ли кто-нибудь прояснить это для меня? Благодарю вас!


person Itachi Uchiwa    schedule 08.06.2021    source источник
comment
Второе предложение после вашей цитаты: эта функция не выделяет никакой памяти;   -  person NathanOliver    schedule 08.06.2021
comment
@NathanOliver: Но вызывает ли он оператора new? а что именно?   -  person Itachi Uchiwa    schedule 08.06.2021
comment
См. (9) здесь en.cppreference.com/w/cpp/memory/new /operator_new   -  person Richard Critten    schedule 08.06.2021
comment
При вызове с адресом и без других аргументов размещение new использует оператор new(size_t, void) для «выделения» своей памяти.Так что да. *Эта функция не выделяет никакой памяти; он просто возвращает свой аргумент-указатель. В общем, ничего.   -  person NathanOliver    schedule 08.06.2021
comment
@SilvioMayolo Ну, это первая книга, указанная в разделе The Definitive C++ Book. Руководство и список :D   -  person Ranoiaetep    schedule 08.06.2021
comment
@NathanOliver: Является ли размещение new своего рода новым выражением, а не новым оператором? и означает ли это, что размещение new вызывает оператор new тоже как новое выражение и почему?   -  person Itachi Uchiwa    schedule 08.06.2021
comment
@ItachiUchiwa Placement new - это способ С++ сказать: Эй, создайте объект типа, который я укажу, в месте, на которое указывает предоставленный указатель. Это оставляет за вами право уже выделить необходимое пространство.   -  person NathanOliver    schedule 08.06.2021
comment
@ItachiUchiwa Прочтите это, это должно помочь все прояснить: stackoverflow.com/questions/35087204/how-c-placement-new-works   -  person NathanOliver    schedule 08.06.2021


Ответы (1)


Я думаю, проблема в том, что выражение new делает две вещи:

  1. выделяет память через operator new
  2. вызывает конструктор объекта в этой выделенной памяти

Теперь, как правило, выделение памяти в конечном итоге вызывает malloc или каким-то образом запрашивает память у ОС. Однако с новым размещением вы переходите к шагу 1 вручную, и вместо вызова функции распределения для предоставления памяти вы передаете указатель, который, как вы обещаете, является допустимым местом для создания объекта. Он просто будет использовать память, которую вы ему дали, чтобы создать объект в том месте, где вы его создадите.

person Chris Uzdavinis    schedule 08.06.2021