Comment faire face à “sortir à temps destructeur” avertissement dans clang?
Dans mon C++11 code j'obtiens le bruit d'avertissement "Déclaration requiert une sortie en temps destructeur" dans le cas suivant:
static const std::map<int, const someStruct> mymap = {
{1, {
"A",
"B",
"C"
}},
{2, {
"D",
"E",
"F"
}}
};
Autant je comprends Google une "sortie-temps destructeur" est nécessaire pour détruire le main() et de la statique, de façon déterministe, pour prévenir les accidents sur la sortie en raison de "déjà publié des variables". Est ce que le droit? Quelqu'un peut-il expliquer mieux?
Plus: Que puis-je faire à ce sujet (je ne veux pas désactiver l'avertissement)? Le code ci-dessus est utilisé dans le contexte d'un thread seulement.
Il semble que ce soit la façon de Chrome traite de ces cas; serait-ce la bonne façon de faire pour mon cas?
#define CR_DEFINE_STATIC_LOCAL(type, name, arguments) \
static type& name = *new type arguments
Vous devez vous connecter pour publier un commentaire.
Mondiale et la fonction des objets statiques obtiendrez leurs destructeurs appelée quand votre application est sortie. ces destructeurs sont "le temps de la sortie des destructeurs". et sont appelés dans l'ordre inverse dans lequel ils ont été construits.
Comme vous l'avez dit, si certaines de ces destructeurs touche déjà détruit des objets, votre programme peut se bloquer. Aussi, les destructeurs de course à la sortie du temps le programme de sortie plus lente, et la plupart du temps, ils ne sont pas nécessaires pour l'exactitude du programme (depuis quand le programme se termine, il va libérer la mémoire de toute façon).
L'avertissement est simplement remarquer que vous avez destructeurs qui va être exécuté au temps de la sortie.
Le correctif que vous avez proposé tas allouer l'objet, qui ne causera pas de il sera automatiquement détruit à la sortie du programme. Pour votre cas, c'est probablement assez bon.
someStruct
’s destructeurs de ne. Je suis en général méfier de la prévention des destructeurs de cours d'exécution. Gestion de la mémoire peut ne pas être un problème plus lors de la sortie du programme, mais d'autres non négligeable des opérations qui peuvent avoir à exécuter quand même. Dans un scénario plus complexe, il devient vite difficile de prouver que n'exécutant pas les destructeurs n'a pas d'aversion effet. En outre, le ralentissement à la sortie du programme est visible uniquement lorsque de grandes portions de la mémoire se libère.