Статическая переменная CComPtr - PullRequest
2 голосов
/ 15 июня 2010

Это плохая идея иметь статические переменные-члены CComPtr в приложении. Так как мы не можем контролировать уничтожение статической переменной, и это может произойти после CoUninitialze.

Ответы [ 3 ]

2 голосов
/ 15 июня 2010

Если вы примете соответствующие меры предосторожности, то использование CComPtr в качестве статического члена не является по своей сути злом.

Под «соответствующими мерами предосторожности» я имею в виду, что вы должны учитывать:

  • Mutexing доступ к нему;
  • Обеспечение инициализации перед использованием;
  • Поддержка статического числа экземпляров для вашего собственного класса;
  • Обеспечение вызова CComPtr::Release в вашем собственном классе FinalRelease метода, когда число экземпляров достигает нуля.
0 голосов
/ 06 сентября 2017

Как сказал Сергей в своем комментарии, я думаю, что это плохо.Деструкторы статических объектов вызываются после главных завершений, как описано в разделе 3.6.3 стандарта C ++ 03:

Деструкторы (12.4) для инициализированных объектов статической длительности хранения (объявленных в области видимости блокаили в области имен) вызывается в результате возврата из main и в результате вызова exit (18.3).Эти объекты уничтожаются в обратном порядке завершения их конструктора или завершения их динамической инициализации.Если объект инициализируется статически, объект уничтожается в том же порядке, как если бы объект был динамически инициализирован.Для объекта массива или типа класса все подобъекты этого объекта уничтожаются до уничтожения любого локального объекта со статической продолжительностью хранения, инициализированной во время построения подобъектов.

и как показано ниже:http://www.geeksforgeeks.org/static-objects-destroyed/.

Но CoUninitialize , который очищает библиотеку COM в главном потоке, вызывается до завершения Main.CoUninitialize очистит все оставшиеся ресурсы, как объяснено в документации msdn.Мы должны вызвать метод Release объектов COM до вызова CoUninitialize, потому что после этого они больше не будут существовать, и поэтому мы должны убедиться, что вызовы деструктора CComPtr происходят до вызова CoUninitialize.Поэтому CComPtr не должен быть статичным.

0 голосов
/ 17 июня 2010

это все равно плохая идея

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...