Una volta ho passato lo stesso dilemma.
Fondamentalmente quello che ho concluso è che, accettando il fatto che quei distruttori stanno lanciando e semplicemente vivendo con le conseguenze di ciò è di solito molto peggio che passare attraverso il dolore di farli non buttare.
La ragione è che si rischiano stati ancora più volatili e imprevedibili quando si lanciano distruttori.
Ad esempio, ho lavorato a un progetto una volta in cui, per vari motivi, alcuni sviluppatori utilizzavano eccezioni per il controllo del flusso in alcune parti del progetto e funzionava perfettamente per anni. Più tardi, qualcuno ha notato che in una parte diversa del progetto, a volte il client non riusciva a inviare alcuni messaggi di rete che doveva inviare, così hanno creato un oggetto RAII che avrebbe inviato i messaggi nel suo distruttore. A volte il networking generava un'eccezione, quindi questo distruttore RAII avrebbe lanciato, ma chi se ne frega? Non ha memoria da ripulire, quindi non è una perdita.
E ciò funzionerebbe correttamente per il 99% delle volte, tranne quando il percorso di controllo del flusso delle eccezioni si verificava per attraversare il collegamento in rete, che genera anche un'eccezione. E poi, hai due eccezioni live che vengono svolte in una sola volta, quindi "bang sei morto", nelle parole immortali delle FAQ C++.
Onestamente preferirei che il programma si interrompesse all'istante quando un distruttore getta, quindi possiamo parlare con chi ha scritto il distruttore di lancio, piuttosto che provare a mantenere un programma con intenzionalmente a lanciare i distruttori, e questo è il consenso del comitato/comunità sembra. Così hanno fatto questo cambiamento decisivo per aiutarti ad affermare che i tuoi distruttori sono bravi e non lanciano. Potrebbe essere molto lavoro se il tuo codice base ha molti hack, ma se vuoi continuare a svilupparlo e mantenerlo, almeno sullo standard C++ 11, è meglio fare il lavoro di pulizia su i distruttori.
linea di fondo:
Hai ragione, non si può davvero sperare di garantire che a trovare tutte le possibili istanze di un distruttore di lancio. Quindi ci saranno probabilmente degli scenari in cui, quando il tuo codice viene compilato in C++ 11, si bloccherà nei casi in cui non sarebbe conforme allo standard C++ 98. Ma nel complesso, ripulire i distruttori e correre come C++ 11 sarà probabilmente molto più stabile che andare con i distruttori di lancio sui vecchi standard.
Interessante sembra che la revisione principale di gcc fornisca un avviso per questo tramite '-Wterminate'. Non vedo un'opzione simile per clang. –
Come ho sempre detto, le specifiche delle eccezioni C++ sono uno scherzo. Scusa, non costruttivo asnwer, ma condivido il tuo dolore. – SergeyA
@ShafikYaghmour Questo è interessante ma il mio GCC 5.2.0 non riconosce l'opzione. Hai un riferimento per questo? – 5gon12eder