Pregunta

En el uso de la "nueva ubicación" se sugiere llamar al constructor y el destructor de forma explícita.

En este caso, los objetos inicializados en la sección de inicialización de una clase también consigue una buena construcción?

Lo mismo también con una llamada explícita al destructor? ¿Los objetos miembro se destruyen correctamente?

¿Fue útil?

Solución

  

En el uso de la "nueva ubicación" se sugiere llamar al constructor y el destructor de forma explícita.

Yo no lo creo. Se dirá que es necesario llamar al destructor de forma explícita.

  

En este caso, los objetos inicializados en la sección de inicialización de una clase también consigue una buena construcción?

Aparte del suministro de la memoria de todos los demás aspectos de la colocación de nuevo son los mismos que nuevo normal. Así que en lugar de asignar dinámicamente la memoria que sólo utiliza el puntero suministrado.

  

Lo mismo también con una llamada explícita al destructor?

Puede (si se siente nada) llamar al destructor de manera explícita en cualquier objeto. Se llamará a la definida por el usuario (o compilador generado) destructor clase como normal. La razón por la que tiene que hacer de forma explícita para objetos creados a través de la colocación de nuevo es que se puede llamar de borrar en estos objetos. Esto se debe borrar asume que el objeto fue creado en memoria y trata asignada dinámicamente a reciclar el que la memoria después de que el destructor se ha llamado.

  

¿Los objetos miembro se destruyen correctamente?

Sí.

Si pensamos de nuevo como esto:

// not real code
template<class T> T* new(void* location = NULL)  (ArgumentsForT)
{
    // If you do not provide location (normal usage)
    // then we allocate some memory for you.
    if (location == NULL)
    {    location = malloc(sizeof(T));   // Use of malloc() is just an example
    }

    ((T*)location)->Constructor(ArgumentsForT);
    return (T*)location;
}

Así que la colocación de nuevo trabajo al igual que lo normal nueva.
En cuanto a la llamada para borrar

template<typename T> void delete(T* obj)
{
    if (obj != NULL)
    {
        obj->~T();
        free(obj);
    }
}

El problema aquí es que no se puede borrar la memoria decir si fue asignado por el nuevo o si la memoria se asignaba por el usuario y pasó a la nueva (nueva ubicación). Por lo que siempre llama libre en la memoria. Si ha utilizado la colocación de nuevo, entonces puede que no haya asignado dinámicamente la memoria (o la memoria sigue siendo utilizado por otra cosa).

char   x[sizeof(T)];  // don't do this (memory may not be aligned correctly).
T*  obj = new (x) T();

delete obj;  // FAIL. The memory was not dynamically allocated.
             //       Delete will try and re-claim this memory for re-yse
             //       Even if the memory is local.

 // This is why on placement new you need to call the destructor
 obj->~T();

Otros consejos

  

En el uso de la "nueva ubicación" es   sugerido para llamar al constructor y   destructor de forma explícita.

No es correcto decir que "llamada al constructor explícitamente ", como constructores no tienen nombres ($ 12.1 / 1).

  

En este caso, los objetos   inicializado en la sección inicializador   de una clase también obtener adecuadamente   construido?

Sí. ¿Por qué lo dudas? Placment nuevos único medio de que el operador new no se asigna ninguna memoria, en lugar va a utilizar la memoria que se pasa en la colocación de nuevo, para construir el objeto. El objeto se construye en la memoria, que se pasa.

  

Lo mismo también con una llamada explícita a la   ¿incinerador de basuras? ¿Los objetos miembro consiguen   destruido correctamente?

Sí.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top