que punteros puntero funciones declarar declaracion con como c++ pointers void delete-operator

c++ - punteros - Cómo eliminar el puntero void?



this-> c++ (3)

Aunque este código es válido, no es una buena práctica.

Como regla general, no debe haber new s y delete s en la naturaleza. Intenta hacer cumplir una regla que solo los constructores pueden llamar new y que solo los destructores pueden llamar delete te ayudará a organizar mejor tu código.

Si está utilizando C ++ 11, siempre pruebe std::shared_ptr y similares, esto hará lo anterior automáticamente para usted.

¿Hay algún problema al eliminar un objeto como este en C ++?

MyCls* c = new MyCls(); void* p = (void*)c; delete (MyCls*)p;


El código está bien definido. Ambos moldes son moldes estáticos, aunque es bueno hacerlo explícito ( static_cast<void*> , etc. ) en lugar de usar moldes de estilo C. El estándar dice que si un puntero a objeto se convierte a un puntero de vacío y regresa mediante moldes estáticos, mantendrá su valor original. Por lo tanto, su expresión de delete final tendrá el mismo efecto que delete c .

Dicho esto, el uso de void* es a menudo un olor a código en C ++.


Esto como está escrito es legal.

La MyCls* a MyCls* es crítica. Sin eso, invocará un comportamiento no definido: no se invocará al destructor MyCls, y también pueden surgir otros problemas (como un bloqueo). Debe volver al tipo correcto.

También tenga en cuenta que esto puede ser complicado si se trata de herencia múltiple y se utilizan múltiples conversiones. Tus moldes deben "coincidir" en cualquier dirección.

Si su código está estructurado de modo que no sepa el tipo en el momento de la destrucción, otorgue a cada objeto eliminable una clase base común con un destructor virtual. Luego, vuelve a la clase base antes de llamar a delete.