Saltar al contenido

Eliminar un objeto en C ++

Solución:

¿No es esta la forma normal de liberar la memoria asociada con un objeto?

Esta es una forma común de administrar la memoria asignada dinámicamente, pero no es una buena manera de hacerlo. Este tipo de código es frágil porque no es seguro para excepciones: si se lanza una excepción entre el momento en que crea el objeto y el momento en que lo elimina, filtrará ese objeto.

Es mucho mejor usar un contenedor de puntero inteligente, que puede usar para obtener una administración de recursos limitada al alcance (más comúnmente se le llama adquisición de recursos es inicialización o RAII).

Como ejemplo de gestión automática de recursos:

void test()
{
    std::auto_ptr<Object1> obj1(new Object1);

} // The object is automatically deleted when the scope ends.

Dependiendo de su caso de uso, auto_ptr puede que no proporcione la semántica que necesita. En ese caso, puede considerar usar shared_ptr.

En cuanto a por qué su programa se bloquea cuando elimina el objeto, no ha proporcionado suficiente código para que nadie pueda responder esa pregunta con certeza.

De hecho, su código utiliza la forma normal de crear y eliminar un objeto dinámico. Sí, es perfectamente normal (¡y de hecho está garantizado por el estándar del idioma!) Que delete llamará al destructor del objeto, al igual que new tiene que invocar al constructor.

Si no estuvieras instanciando Object1 directamente, pero alguna subclase de la misma, les recuerdo que cualquier clase destinada a ser heredada debe tener un virtual destructor (para que el destructor de la subclase correcta se pueda invocar en casos análogos a este), pero si su código de muestra es realmente representativo de su código real, este no puede ser su problema actual, debe ser otra cosa, tal vez en el destructor código que no nos está mostrando, o alguna corrupción de pila en el código que no está mostrando dentro de esa función o los que llama …?

Por cierto, si siempre va a eliminar el objeto justo antes de salir de la función que lo instancia, no tiene sentido hacer que ese objeto sea dinámico, simplemente declarelo como local (clase de almacenamiento auto, como es la variable predeterminada) de dicha función!

¿No es esta la forma normal de liberar la memoria asociada con un objeto?

Sí lo es.

Me di cuenta de que invoca automáticamente al destructor … ¿es esto normal?

Asegúrese de no haber eliminado dos veces su objeto.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *