c++ - orientada - que es un constructor en programacion
Llamar a un constructor en una memoria ya asignada (3)
Tenga en cuenta 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 obj
puntero de objeto de la clase Foo
el destructor se puede llamar explícitamente de la siguiente manera:
obj->~Foo();
aquí hay una breve pregunta:
Usando C ++, ¿cómo puedo llamar a un constructor en una región de memoria que ya está asignada?
Puede usar el nuevo constructor de ubicación, que toma una dirección.
Foo* foo = new (your_memory_address_here) Foo ();
Eche un vistazo a una explicación más detallada en C ++ FAQ lite o en MSDN . Lo único que necesita para asegurarse de que la memoria está alineada correctamente (se supone que malloc
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).
El nuevo constructor de ubicación mencionado por la respuesta aceptada es una forma antigua antes de la clase de asignador definida en el encabezado. Ahora realmente deberías 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.