2009-02-06 12 views

Respuesta

35

Puede utilizar el nuevo constructor de ubicación, que toma una dirección.

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

Tome un vistazo a una explicación más detallada en el C++ FAQ lite o la MSDN. Lo único que necesita para asegurarse de que la memoria está alineada correctamente (malloc se supone que devuelve la memoria que está correctamente alineada para cualquier cosa, pero tenga cuidado con cosas como SSE que pueden necesitar alineación con límites de 16 bytes más o menos).

+3

Para cualquier otra persona que se tropiece con esto: tuve que '#include ' antes de que esto funcionara - g ++ arrojó un montón de errores inútiles de "función no coincidente" si no lo hacía. [Este] (http://www.parashift.com/c++faq-lite/dtors.html#faq-11.10) es la información sobre la ubicación nueva (también C++ FAQ) que me ayudó a resolverlo. –

6

Observe que antes de invocar la ubicación new, debe llamar al destructor en la memoria, al menos si el objeto tiene un destructor no trivial o contiene miembros que sí lo tienen.

Para un puntero de objeto de clase objFoo el destructor de manera explícita se puede llamar de la siguiente manera:

obj->~Foo(); 
+2

¿Por qué deberíamos llamar al destructor en la memoria recién asignada antes de hacer la colocación nueva? No lo entiendo ... – Malkocoglu

+1

Normalmente no obtienes memoria que ha sido asignada pero no inicializada. Si eso es lo que tienes, por supuesto, * no debes * llamar a un destructor. Para todos los demás casos, ya hay un objeto en esa ubicación que debe desecharse adecuadamente. –

+1

No inicializa la memoria (a menos que quiera establecer todos los ceros). Inicializas objetos Llamar a dtor en alguna memoria aleatoria es malo. Solo si está haciendo contenedores de objetos, tendría sentido llamar a dtor. Si estos objetos tienen un dtor no virtual vacío, no tienes que hacerlo. –

2

La colocación constructor new mencionado por la respuesta aceptada es una manera de edad antes de la clase asignador define en la cabecera. Ahora realmente debería hacer (en C++ 11 estilo):

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); 

Eso es todo.

Cuestiones relacionadas