天天看點

C++全局靜态變量的析構

忙了将近一年的2個項目終于在末日來臨前結束了,一直都在忙,忘了積累曾經遇到過解決過的問題,翻開收藏夾,好多好多,讓人看完不知道該怎麼下手,也意識到必須來更新部落格了,同時領悟到在項目時候,一個文檔,可以零星記錄問題的始終,在結項的時候,利用幾天偷閑的時光,整理整理,對于領悟與回味,甚好。

         因為項目是從單一模式到多個模式,是以原來的Singleton類 ,變得有點複雜,它們之間突然多了某種構造依賴關系和析構依賴關系,雖然我們可以利用Meyers Singleton來控制構造順序,卻不能控制析構順序。

引用摘錄的一段:

       Scott Meyer在<<Effective C++>>3rd Item4中提出了一個解決方案,當将non-local static變量移動到靜态方法中成為local static變量的時候。C++保證當第一次靜态方法被調用的時候,才會建立該靜态變量。但是這裡有一個疑問,建立順序能夠被控制了,可是析構順序呢?我們隻知道程序結束的時候,local static 變量會被析構,而且按照建立順序的相反順序進行。如果幾個Singleton類的析構函數之間也有依賴關系,并且這種依賴順序關系和LIFO順序沖突,就會造成dead-reference問題。

       一開始軟體總在關閉的時候出現異常crash掉,仔細追蹤之下,才發現是Singleton類的析構出了問題,dead-reference問題,終于意識到已經把基礎掉了一地,同一些技術群友讨論得到如此心得,雖然我最後解決問題是去掉了Singleton的繼承,因為對整個項目做了一次Singleton的瘦身活動,精簡了一些沒有必要,或者在多線程裡面不确定的因素,統統cut掉繼承Singleton,從單一模式改項目到多線程,多DLL環境,處理這些問題,真是嘔心瀝血。

         C++全局靜态變量的析構銷毀順序是未定義的,特别是在多線程環境,多dll環境下,特别複雜。

         如果是單線程的話,建議用指針的方式,在AppInit的時候構造,在AppExit的時候delete,并設定為0。别的地方引用的時候先判斷。

         多線程的話,顯然要加鎖了,需要效率的話,原子鎖

轉載于:https://www.cnblogs.com/to-be-st/archive/2012/12/08/2808408.html