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.