動態庫之全局對象、靜態對象

我們都知道,全局對象是相對局部對象、靜態對象而言的,具體的定義如下:
局部對象就是隻在局部使用比如在函數裏,複合語句裏,出了局部環境就不存在了。  
靜態對象分爲靜態全局對象和靜態局部對象:靜態局部對象和局部對象的用法類似,但其在退出整個程序時,才消失,不象局部對象出了局部環境就不存在了;靜態全局對象只在其申明的文件內是全局的,其它文件不能訪問,其也是退出整個程序時,才消失。
全局對象對整個程序是可見的。其也是退出整個程序時,才消失。
對於一個應用程序來說,上面的說明已經足夠清楚了,但是對應動態連接庫中的全局對象、靜態對象是如何分配內存和使用的呢?今天測試程序遇到的問題使我徹底明白了其關係。
首先說明一下動態庫結構,有一個接口類CInterface和全局對象goMap,goMap是一個保存數據的map表,由於許多類需要使用,所以使用了全局對象。
我是這樣調用動態庫的,先通過Create接口創建接口類CInterface的對象(new方法),然後調用Open填充goMap的數據、並打開各類線程進行工作;當我只創建了一個動態庫對象時沒有發生問題,而後的測試需要創建4個動態庫對象時卻出現了錯誤;我分別每個動態庫對象的goMap保存信息進行了輸出,發現它們的內容完全一樣了,都變成了最後一次填充的數據,而實際上每次填充的數據是完全不同。
也就是說,雖然我使用了動態庫且new出接口類對象,但動態庫中的全局對象仍然只有一個,所以被多次清除和填充數據了。從這點看,設計模式之Singleton(單態),無論是在應用程序還是其調用的動態庫,也應該只有一份,大家可以共享其應用的。
另外,還測試了一下靜態變量。測試使用靜態變量初始化後自增長,如下代碼:
 static int l_iTemp = 0;
 return l_iTemp++;
創建了多個動態庫,但發現實際上l_iTemp僅初始化了一次;也就是說動態庫類的成員函數中,靜態變量也是共用一個內存地址的。
通過以上測試,徹底明白了動態庫和應用程序在處理全局對象、靜態對象時沒有差別;那局部對象也應當是沒有差別的了。
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章