在應用程序中使用靜態CComPtr成員變量是不好主意。 由於我們不能控制對靜態變量的銷燬,並且可能會在CoUninitialze之後發生。Static CComPtr變量
2
A
回答
2
只要你採取適當的預防措施,那麼使用CComPtr
作爲靜態成員並不是天生就是邪惡的。
「適當的措施」,我的意思是你應該考慮:
- Mutexing訪問它;
- 確保使用前已初始化爲 ;
- 爲您自己的類維護一個互斥的靜態實例計數;
- 確保在實例計數達到零時,在您的班級自己的
FinalRelease
方法中調用CComPtr::Release
。
0
這是一個壞主意,反正
0
正如謝爾蓋說,在他的評論,我覺得這是不好的。靜態對象的析構函數在主終止後調用,如C++ 03標準的第3.6.3節所述:
靜態存儲持續時間的初始化對象的析構函數(12.4)(在塊作用域或命名空間聲明)範圍)作爲從main返回的結果和由於調用exit(18.3)而被調用。這些對象按照構造函數完成或動態初始化完成的相反順序銷燬。如果一個對象被靜態初始化,那麼這個對象就會被以相同的順序銷燬,就像對象被動態初始化一樣。對於數組或類類型的對象,在構造子對象期間初始化具有靜態存儲持續時間的任何局部對象被銷燬之前,該對象的所有子對象都被銷燬。
並在此演示:http://www.geeksforgeeks.org/static-objects-destroyed/。
但是,在Main終止之前調用主線程上清理COM庫的CoUninitialize。按照msdn文檔中的說明,CoUninitialize將清理所有剩餘的資源。在調用CoUninitialize之前,我們應該調用COM對象的Release方法,因爲它們將不再存在,因此我們應該確保在調用CoUninitialize之前調用CComPtr析構函數。因此CComPtr不應該是靜態的。
相關問題
- 1. static final變量的值
- 2. C++ static non-static
- 3. shared_ptr vs CComPtr
- 4. CComPtr通過引用
- 5. static extern vs extern static
- 6. CComPtr和引用計數
- 7. shared_ptr的 - 但是CComPtr交換
- 8. static中的關鍵字和外部變量C
- 9. PHP中「GLOBAL」和「STATIC」變量有什麼區別?
- 10. 如何在處理參數時使用static int變量?
- 11. 當服務被調用時,android- static變量會被更新嗎?
- 12. 模板類中的C++模板static const成員變量
- 13. 可以在java中將volatile變量定義爲static嗎?
- 14. Static關鍵字
- 15. Const vs Static Const
- 16. Static Deconstructor
- 17. Static Lazy Initializer
- 18. Java Static typing
- 19. C/C++ Static Voodoo
- 20. static final String或strings.xml
- 21. static :: staticFunctionName()
- 22. static ExecutorService
- 23. Static Dropout Layer - Keras
- 24. Qt 5.6 msvc static compile
- 25. CComPtr CoCreateInstance返回0x80070582(類已存在)
- 26. ATL CComPtr連接,分離和分解
- 27. 在C++/CLR類中的成員CComPtr
- 28. android build static lib
- 29. 無法將120的值賦予靜態常量無符號字符或將值賦給常量static static unsigned int
- 30. 如何在JAVA STRUTS2中從java類訪問另一個STATIC變量?
您已經回答了您的問題。是的,這是不好的。 – 2010-06-15 09:42:38