Nel mio codice C++ 11 ottengo il clangore di avvertimento "Dichiarazione richiede un distruttore uscita-time" nel seguente caso:Come gestire l'avviso di "distruttore di uscita-tempo" in clang?
static const std::map<int, const someStruct> mymap = {
{1, {
"A",
"B",
"C"
}},
{2, {
"D",
"E",
"F"
}}
};
Per quanto ho capito Google una "exit-tempo distruttore" è richiesto distruggere main() e statics in modo deterministico per prevenire arresti anomali all'uscita a causa di "variabili già rilasciate". È giusto? Qualcuno può spiegarlo meglio?
Plus: Cosa posso fare al riguardo (non voglio disabilitare l'avviso)? Il codice sopra riportato viene utilizzato nel contesto di un solo thread.
Sembra che questo sia il modo in cui Chromium si occupa di questi casi; sarebbe il modo giusto anche per il mio caso?
#define CR_DEFINE_STATIC_LOCAL(type, name, arguments) \
static type& name = *new type arguments
A seconda del distruttore 'someStruct'. Sono generalmente cauto nell'impedire che vengano distrutti i distruttori. La gestione della memoria potrebbe non essere più un problema all'uscita dal programma, ma potrebbero comunque essere necessarie altre operazioni non banali. In uno scenario più complesso diventa rapidamente difficile dimostrare che non eseguire i distruttori non ha alcun effetto avverso. Inoltre, il rallentamento all'uscita del programma è evidente solo quando vengono rilasciate ampie porzioni di memoria. –
Sì, è per questo che dico "probabilmente" e "il più delle volte". Se i tuoi distruttori interagiscono con il resto del sistema tramite una sorta di IO, allora vuoi che questi distruttori funzionino. Un semplice esempio potrebbe essere un oggetto di configurazione globale che salva le impostazioni su disco quando il programma si chiude, e ci si basa sul distruttore per sapere quando ciò accade (non che io sostenga il codice che fa ciò). – yiding
@KonradRudolph La struttura è tre "const char *". Pertanto, il mio collega di lavoro giustamente osserva che l'allocazione dell'heap è eccessiva. C'è un modo per rendere questo avvertimento gratuito senza allocazione di heap? –