Что такое встроенный конструктор на С++?
Возможный дубликат:
"Новое место размещения на С++"
Что такое встроенный конструктор в С++?
например. Datatype * x = new (y) Тип данных();
Ответы
Ответ 1
Это называется размещением нового оператора. Это позволяет вам предоставлять память, в которой будут размещаться данные, без необходимости выделения их new
оператором. Например:
Foo * f = new Foo();
Выше будет выделять память для вас.
void * fm = malloc(sizeof(Foo));
Foo *f = new (fm) Foo();
Выше будет использовать память, выделенную при вызове malloc
. new
больше не будет выделять. Вы, однако, не ограничены классами. Вы можете использовать оператор размещения new для любого типа, который вы бы выделили при вызове new
.
"Поправка" для размещения новых заключается в том, что вы не должны освобождать память, выделенную при вызове оператора размещения новых с использованием ключевого слова delete
. Вы уничтожите объект, вызвав деструктор напрямую.
f->~Foo();
После того, как деструктор вызван вручную, память может быть освобождена, как и ожидалось.
free(fm);
Ответ 2
Короткий ответ заключается в том, что ваш код создает объект в пространстве, на которое указывает y
. Длинный ответ лучше всего рассмотрен часто задаваемые вопросы по С++.
Ответ 3
Это более широко известно как "размещение нового" и хорошо обсуждается в FAQ по С++ (в области "Destructors" ):
Он позволяет создавать объекты в необработанной памяти, которые могут быть полезны в определенных специализированных ситуациях, например, когда вам может понадобиться выделить массив для большого числа возможных объектов, но при необходимости нужно построить по необходимости, потому что вы часто может не понадобиться нигде рядом с максимумом, или потому, что вам нужно или нужно использовать специализированный распределитель памяти.
Ответ 4
Я ржавый на этом, но он позволяет вам записать объект в выделенный вами блок памяти. Для исправления его также требуется обратная инструкция удаления.
Ответ 5
Если вы используете пул памяти, вам нужно использовать конструктор in place для инициализации вашего объекта, поскольку они выделены из пула.
Ответ 6
Это способ вызова конструктора без выделения памяти. Ваш y
должен быть указателем, поместившим достаточную память для нового объекта Datatype. Кроме того, не вызывайте delete
, вызывайте ~DataType()
.