2012-06-11 17 views
8

È valido chiamare qualche funzione in destructor con argomento this? La funzione non memorizza il puntatore, ma assume l'oggetto funzionale completo.Utilizzo di "this" in destructor

+1

L'oggetto è completamente valido fino all'ultima riga del DTOR. Ovviamente se il DTOR stesso distrugge pezzi dell'oggetto (ad esempio nulls fuori ptr ecc.) Allora ti stai sparando al piede, ma è interamente il tuo codice, non quello che genera il cpler ... –

risposta

14

this è ancora valido nel distruttore.

Tuttavia, è necessario tenere presente che le funzioni virtuali non funzionano più correttamente come ci si potrebbe aspettare una volta che l'oggetto viene distrutto; vedere per es. Never Call Virtual Functions during Construction or Destruction. In sostanza, il tipo dinamico dell'oggetto viene modificato al completamento di ogni distruttore.

+4

Loro ** fanno ** lavorare bene. È solo la definizione di funzioni correttamente funzionanti è diversa. Voglio dire - funzionano come progettati. – valdo

+1

@valdo: punto giusto! Ho modificato la mia risposta ... –

+2

O comunque, la definizione del comitato di "funzionare correttamente" non è molto utile nella pratica. Sono sicuro che è possibile inventare un caso d'uso in cui si desidera chiamare le versioni di classe base delle funzioni virtuali nel ctor/dtor di base e che il comitato aveva in mente qualcosa del genere. Altrimenti avrebbero dato maggiore libertà alle implementazioni, e hanno appena detto che è UB a fare la chiamata. Questo sarebbe probabilmente più efficiente, dal momento che l'implementazione non dovrebbe continuare a regolare il puntatore del vtable (o equivalente) al completamento di ogni dtor. Così com'è, paghiamo per qualcosa che non usiamo. –

2

In una parola: SÌ.
È completamente valido per utilizzare this nel D`TOR

Problemi correlati