sobrecarga - que es un destructor en c++
¿Qué es un constructor in situ en C++? (6)
Posible duplicado:
La "colocación nueva" de C ++
¿Qué es un constructor in situ en C ++?
por ejemplo, tipo de datos * x = new (y) Datatype ();
Es una forma de llamar a un constructor sin asignar memoria. Tu y
tiene que ser un puntero que soporta suficiente memoria para un nuevo objeto de tipo de datos. Además, no llame a delete
, llame a ~DataType()
.
Esto es más comúnmente conocido como ''colocación nueva'' y se discute bastante bien en las preguntas frecuentes de C ++ (en el área ''Destructors''):
Le permite construir objetos en la memoria bruta, lo que puede ser útil en ciertas situaciones especializadas, como cuando puede asignar una matriz para una gran cantidad de objetos posibles, pero luego desea construirlos según sea necesario porque a menudo puede que no necesite en cualquier lugar cerca del máximo, o porque quiere o necesita usar un asignador de memoria personalizado.
Estoy oxidado en esto, pero te permite escribir el objeto en un bloque de memoria que ya has asignado. También necesita una declaración de eliminación recíproca para borrarla de la memoria.
La respuesta corta es que su código construye un objeto en el espacio apuntado por y
. La respuesta larga está mejor cubierta por las preguntas frecuentes de C ++ .
Si usa un grupo de memoria, necesita usar el constructor in situ para inicializar su objeto a medida que se asignan del grupo.
Esto se llama el nuevo operador de ubicación. Le permite suministrar la memoria en la que se asignarán los datos sin que el new
operador la asigne. Por ejemplo:
Foo * f = new Foo();
Lo anterior asignará memoria para usted.
void * fm = malloc(sizeof(Foo));
Foo *f = new (fm) Foo();
Lo anterior utilizará la memoria asignada por la llamada a malloc
. new
no asignará más. Sin embargo, no estás limitado a las clases. Puede utilizar un nuevo operador de ubicación para cualquier tipo que asigne con una llamada a new
.
Un ''gotcha'' para la ubicación nueva es que no debe liberar la memoria asignada por una llamada al nuevo operador de colocación utilizando la palabra clave delete
. Destruirá el objeto llamando al destructor directamente.
f->~Foo();