2012-06-19 9 views
7

Nel suo articolo perspicace,
Error and Exception Handling,
@Dave Abrahams dice:Spiegazione richieste circa doppia distruzione di eccezione oggetti

Fai la tua classe di eccezione immunitario a doppio distruzione, se possibile . Sfortunatamente, diversi compilatori popolari causano occasionalmente la distruzione di oggetti di eccezione due volte. Se puoi fare in modo che ciò sia innocuo (ad esempio azzerando i puntatori cancellati) il tuo codice sarà più robusto.

io non sono in grado di comprendere questa particolare linea guida, qualcuno può:

  1. Si prega di fornire un esempio di codice di questo doppio scenario di distruzione &
  2. Qual è il modo migliore per attuare una classe eccezione personalizzata per evitare questo?
+2

Secondo [questo thread] (http://compgroups.net/comp.lang.c++.moderated/exception-objects-to-be-destroyed-twi/104604), è un errore nel compilatore che causa il doppio distruzione. – chrisaycock

+2

@chrisaycock: oh, non ho fatto una ricerca su google su questo prima di postare, pensavo che forse il mio dubbio era troppo specifico o banale che qualcuno avrebbe avuto lo stesso dubbio. Che mi porta un altro Q *** Questa linea guida è ancora rilevante? *** –

risposta

5

Come @Tony detto, questa linea guida è stato inteso come una protezione contro gli insetti del compilatore. Questa linea guida risale al 2001 o giù di lì, quando il supporto alle eccezioni era probabilmente ancora un po 'instabile. Da allora, penso/spero che molti compilatori abbiano risolto questo bug, quindi le linee guida potrebbero non essere più rilevanti.

FWIW, questo orientamento è stato eliminato da the CERT coding practices. Nella discussione di questa pagina, viene sollevato un punto interessante: distruggere un oggetto due volte è UB, quindi qualsiasi cosa tu faccia per gestirla nelle tue classi non renderà mai prevedibile il tuo programma.

Tuttavia, se si vuole veramente il vostro codice per essere compilatori tutta portatili (comprese le vecchie versioni), probabilmente si dovrebbe prendere tutti questi piccoli difetti in considerazione.Ad esempio, Boost ha un sacco di lavoro per aggirare i bug del compilatore; potrebbero semplicemente scrivere codice conforme allo standard e differire la responsabilità dei fallimenti nelle implementazioni, ma ciò ostacolerebbe l'adozione delle loro librerie.

Se è necessario mettere la stessa cura quando si scrive il codice dipende dalle proprie esigenze e in sostanza si riduce a questa domanda: il supporto di dozzine di compilatori vale davvero la quantità di lavoro che implica?

3

Per citare Articolo di @chrisaycock:

"perché distruggono due volte"? A causa dei bug del compilatore, ecco perché! Questo è un errore , i compilatori non dovrebbero farlo. Ma loro lo fanno. Ho lavorato a un progetto in cui sono stato morso da questo utilizzando il compilatore Studio8 di Sun. I ha creato un oggetto ostringstream in una clausola catch e lo ha ottenuto con lo destrutturato due volte. Per risolvere il problema l'ho spostato prima del tentativo, quindi è stato eseguito il . Questo tipo di bug non si verifica molto spesso. La maggior parte delle volte la creazione di oggetti nella clausola catch era ok, ma è qualcosa da sapere di .

saluti,

Andrew Marlow

+0

Mi solleva una serie di domande: *** "Questa linea guida è ancora pertinente?" ***, *** "Il codice che scrivo prenderà anche in considerazione gli errori del compilatore?" ***. Scrivere codice standard di adesione UB standard è abbastanza difficile, dovrei anche occuparmi di tutte queste cose? –

+0

+1 Tony grazie per la risposta, @LucTouraille, Ben espressa. Se puoi per favore combinare entrambi i tuoi commenti e postarla come risposta, sarò felice di contrassegnarla come risposta accettata. Il commento sulla linea guida è stato eliminato risposte una mia di domande in specifico. –

1

Non c'è scenario nel standard in cui un oggetto può essere distrutto due volte. Qualsiasi istanza in cui ciò si verifica è un bug per conto dell'utente o, dove l'oggetto viene distrutto dal compilatore come un'eccezione, quindi il bug del compilatore. Non ho mai sentito parlare di un simile bug prima di ora in qualsiasi compilatore principale, e non vedo alcun motivo per credere che sarà problematico per chiunque stia scrivendo codice C++ in generale.

+0

Infatti, distruggere lo stesso oggetto due volte è un comportamento indefinito garantito e non ho mai incontrato nessuno di questi scenari, quindi la domanda. + 1 Grazie per la risposta però. –

Problemi correlati