Non perderà l'oggetto che si sta eliminando, il blocco di memoria verrà liberato.
Se non è stato dichiarato il distruttore in base_class
di essere virtuale allora sarà fuoriuscire eventuali oggetti allocati dinamicamente contenuti all'interno derived_class
che si basano sul distruttore di derived_class
essere chiamato per liberarli. Questo perché se il distruttore non è virtuale, in questo caso non viene chiamato il distruttore derived_class
. Significa anche che i distruttori di "oggetti incorporati" all'interno di derived_class
non verranno automaticamente chiamati, un problema separato ma aggiuntivo, che può portare a ulteriori perdite e alla mancata esecuzione del codice di pulizia vitale.
In breve, dichiara che il distruttore in base_class
è virtuale e puoi utilizzare la tecnica che hai presentato in tutta sicurezza.
Per un esempio di codice, si veda:
In what kind of situation, c++ destructor will not be called?
Il codice non viene compilato. Consiglierei di passarlo prima tramite un compilatore. Meglio sarebbe: 'base_class * ptr = new derived_class();' –
Se 'base_class' non ha un distruttore virtuale questo attiverà un comportamento indefinito (§5.3.5/p3) –