Question

Est-ce une mauvaise idée d'avoir des variables statiques membres de CComPtr dans une application. Étant donné que nous contrôlons cannt la destruction de la variable statique et il peut se produire après CoUninitialze.

Était-ce utile?

La solution

Pourvu que vous prenez les précautions appropriées, puis à l'aide d'un CComPtr en tant que membre statique n'est pas un mal en soi.

Par "précautions appropriées", je veux dire que vous devriez considérer:

  • l'accès Mutexing à lui;
  • Veiller à ce qu'il a été initialisées avant utilisation;
  • Maintining un compte d'instance statique mutexed, pour votre propre classe;
  • CComPtr::Release est appelée dans votre classe propre < a href = "http://msdn.microsoft.com/en-us/library/ea0ca499.aspx" rel = "nofollow noreferrer"> FinalRelease méthode lorsque le cours de comptage instance zéro.

Autres conseils

est une mauvaise idée de toute façon

Comme Sergey a dit dans son commentaire, je pense qu'il est mauvais. Destructeurs d'objets statiques sont appelés après principales se termine comme indiqué dans 3.6.3 section§ de la norme C ++ 03:

  

Destructors (12.4) pour les objets initialisés de durée de stockage statique (déclarée à la portée du bloc ou du champ d'application d'espace de noms) sont appelés à la suite du retour de la principale et à la suite de l'appel de sortie (18.3). Ces objets sont détruits dans l'ordre inverse de l'achèvement de leur constructeur ou de la fin de leur initialisation dynamique. Si un objet est initialisé statiquement, l'objet est détruit dans le même ordre que si l'objet a été initialisé dynamiquement. Pour un objet de réseau ou le type de classe, tous les sous-objets de l'objet sont détruits avant tout objet local avec la durée de stockage statique initialisé lors de la construction des sous-objets est détruit.

et comme demoed ici: http://www.geeksforgeeks.org/static-objects -destroyed / .

CoUninitialize qui nettoie la bibliothèque COM sur le thread principal est appelé avant principal se termine. CoUninitialize va nettoyer toutes les ressources restantes comme expliqué dans la documentation msdn. Nous devons appeler la méthode Libération des objets COM avant CoUninitialize est appelé parce qu'ils n'existeront plus après et donc nous devons nous assurer que les appels à CComPtr destructor se produire avant CoUninitialize est appelé. Par conséquent, un CComPtr ne doit pas être statique.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top