Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

obj->~Foo();

Ответ 3

Новый конструктор размещения, упомянутый принятым ответом, является старым способом перед классом распределителя, определенным в заголовке. Теперь вам действительно нужно (в стиле С++ 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 constructors
alloc.construct(p, args, ...); 

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

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

Что это.