web-dev-qa-db-fra.com

Le C ++ appelle-t-il des destructeurs pour les variables statiques globales et de classe?

D'après mon exemple de programme, il semble qu'il appelle les destructeurs dans les deux cas. À quel moment appelle-t-il les destructeurs pour les variables globales et statiques de classe, car ils doivent être alloués dans la section des données de la pile de programmes?

49
user236215

Du § 3.6.3 de la norme C++ 03:

Les destructeurs (12.4) pour les objets initialisés de durée de stockage statique (déclarés à la portée du bloc ou à la portée de l'espace de noms) sont appelés suite au retour de main et suite à l'appel de exit (18.3). Ces objets sont détruits dans l'ordre inverse de l'achèvement de leur constructeur ou de l'achèvement de leur initialisation dynamique. Si un objet est initialisé statiquement, l'objet est détruit dans le même ordre que si l'objet était initialisé dynamiquement. Pour un objet de type tableau ou classe, tous les sous-objets de cet objet sont détruits avant la destruction de tout objet local avec une durée de stockage statique initialisée lors de la construction des sous-objets.

En outre, le § 9.4.2 7 stipule:

Les membres de données statiques sont initialisés et détruits exactement comme les objets non locaux (3.6.2, 3.6.3).

Cependant, si un destructeur n'a aucun comportement observable, il ne peut pas être invoqué. Terry Mahaffey détaille cela dans son réponse à "Un destructeur C++ est-il garanti de ne pas être appelé avant la fin du bloc?" .

62
outis

Quelque part après "principal"

(vous ne pouvez pas savoir ou vous fier à l'ordre exact dans lequel ils sont appelés)

2
Vi.