2012-01-07 9 views
7

ho due classi, BASE_CLASS e Derived_Class e al codice seguente:eliminazione di un oggetto derivato tramite un puntatore alla sua classe base

base_class *ptr = new derived_class; 
delete ptr; 

sarà questo codice di produrre una perdita di memoria? Se sì, come dovrei affrontarlo?

+1

Il codice non viene compilato. Consiglierei di passarlo prima tramite un compilatore. Meglio sarebbe: 'base_class * ptr = new derived_class();' –

+3

Se 'base_class' non ha un distruttore virtuale questo attiverà un comportamento indefinito (§5.3.5/p3) –

risposta

21

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?

+0

grazie, questo risponde alle mie preoccupazioni –

Problemi correlati