È 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
risposta
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.
Loro ** fanno ** lavorare bene. È solo la definizione di funzioni correttamente funzionanti è diversa. Voglio dire - funzionano come progettati. – valdo
@valdo: punto giusto! Ho modificato la mia risposta ... –
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. –
In una parola: SÌ.
È completamente valido per utilizzare this
nel D`TOR
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 ... –