Esta es la ubicación nueva.
Aunque generalmente no lo usa con tipos enteros.
Se usa generalmente para construir un búfer donde luego se crean otros tipos.
// Allocate a buffer with enough room for two T objects.
char* buffer = new char[sizeof(T) * 2];
// Allocate a T in slot zero
T* t1 = new (buffer + 0 * sizeof(T)) T("Zero");
// Allocate a T in slot one
T* t2 = new (buffer + 1 * sizeof(T)) T("One");
Eso es lo básico.
Pero recuerde que los objetos asignados con la ubicación nueva no se pueden eliminar con la instrucción delete
. Esto es porque delete
intenta reclamar la memoria asignada por new
(así como también llamar al destructor). Entonces, para usar estos objetos correctamente, debe llamar manualmente allí al destructor.
t1->~T();
t2->~T();
No olvides eliminar el búfer original.
delete [] buffer;
A otros algunas advertencias:
gente a menudo ve ese búfer podría ser implementado en la pila y así ser liberados de forma automática
char buffer[sizeof(T) * 2];
Desafortunadamente esto puede ser técnicamente OK (Compila). Pero no se garantiza que funcione ya que la memoria del búfer puede no estar alineada correctamente para que se coloque una T en su interior. Por lo tanto, debe asignar el búfer dinámicamente (mediante el uso de la función nueva garantiza que la memoria está alineada correctamente para cualquier objeto del tamaño asignado (por lo tanto, también se alinea para cualquier tamaño más pequeño que el tamaño asignado). La forma más fácil de moverse este problema es utilizar un std :: vector
std::vector<char> buffer(sizeof(T) * 2);
T* t1 = new (&buffer[0] + 0 * sizeof(T)) T("Zero");
T* t2 = new (&buffer[0] + 1 * sizeof(T)) T("One");
Otro uso de la colocación de nuevo es restablecer un objeto
he visto este hecho, pero yo prefiero usar el operador de asignación más estándar:.
T obj1("Plop");
obj1 = T("Another Plop");
// Can be done like this:
T obj1("Plop");
obj1.~T();
new (&obj1) T("Another Plop"); // Seems excessive to me. But can be us-full
// in some extreme situations.
Recuerde que si usa el método de reinicio primero debe destruir el objeto viejo (o el objeto puede no comportarse correctamente).
Nota: La ubicación nueva no suele utilizarse con int (ya que no tiene ninguna ventaja (int no tiene un constructor)). –
@Martin: aunque 'new (x) int()' sería diferente y podría usarse a través de una plantilla. Usar siempre parens, incluso con new [], es una buena idea. –
Un enlace a la otra pregunta donde viste esto podría ser útil. –