2010-06-15 62 views
2

在應用程序中使用靜態CComPtr成員變量是不好主意。 由於我們不能控制對靜態變量的銷燬,並且可能會在CoUninitialze之後發生。Static CComPtr變量

+0

您已經回答了您的問題。是的,這是不好的。 – 2010-06-15 09:42:38

回答

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不應該是靜態的。