Вызов конструктора в уже выделенной памяти - PullRequest
26 голосов
/ 06 февраля 2009

вот короткий вопрос:

Используя C ++, как я могу вызвать конструктор в области памяти, которая уже выделена?

Ответы [ 3 ]

41 голосов
/ 06 февраля 2009

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

Foo* foo = new (your_memory_address_here) Foo ();

Ознакомьтесь с более подробным объяснением в C ++ FAQ lite или MSDN . Единственное, что вам нужно, чтобы убедиться, что память правильно выровнена (malloc должна возвращать память, которая правильно выровнена для чего-либо, но остерегайтесь таких вещей, как SSE, которые могут нуждаться в выравнивании по границам 16 байтов или около того).

5 голосов
/ 06 февраля 2009

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

Для указателя объекта obj класса Foo деструктор может быть явно вызван следующим образом:

obj->~Foo();
3 голосов
/ 21 октября 2017

Размещение нового конструктора, упомянутого в принятом ответе, является старым способом перед классом распределителя, определенным в заголовке. Теперь вы действительно должны сделать (в стиле C ++ 11):

allocator<Foo> alloc;
//Allocate memory for one or n objects
auto p = alloc.allocate(1); 
//Construct an object of Foo on allocated memory block p, by calling one of Foo's constructors
alloc.construct(p, args, ...); 

//OK, p now points to a Foo object ready for use...

//Call Foo's destructor but don't release memory of p
alloc.destroy(p); 
//Release memory
alloc.deallocate(p, 1); 

Вот и все.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...