2011-01-10 87 views
0

我目前正在加載包含全局操作存儲(這是該功能的簡化視圖)的共享庫的應用程序。在一個非常簡單的看法,這是我有:加載共享庫時全局變量重置

共享libary具有登記在店裏的操作和外觀類似的一類:

// Factory.h 

class Factory 
{ 
public: 
    typedef void (*FuncPtr)(); 
    typedef std::multimap<std::string, FuncPtr> StoreType; 

static void Register(const std::string& name, FuncPtr func) 
{ 
    m_Store.insert(std::pair<std::string, FuncPtr>(name, func)); 

    using namespace std; 
    cout << "*** Count: " << ++Count << ", Size: " << m_Store.size() << endl; 
} 

public: 
    static StoreType m_Store; 
    static int Count; 
}; 


struct Register 
{ 
    Register(const std::string& name, Factory::FuncPtr func) 
    { 
     Factory::Register(name, func); 
    } 
}; 



// Factory.cpp 
#include "Factory.h" 

Factory::StoreType Factory::m_Store; 
int Factory::Count = 0; 

也有幾個的.cpp註冊操作的庫內的文件。註冊發生爲:

void Func() 
{ 
... // some operation 
} 

Register obj("name", Func); 

當執行主應用程序時,該庫將作爲依賴項加載。主應用程序本身有一些註冊操作的.cpp。

輸出,當我運行這段代碼是我得到:
---數:1,尺寸:1
---數:2,大小:2
---數:3,大小: 3
---計數:4,尺寸:4
---計數:5,大小:1
---計數:6,大小:2
---計數:7,尺寸:3
---數量:8,尺寸:4
---數量:9,尺寸:5
---數量:10,尺寸:6
---計數:11,尺寸:7
---計數:12,尺寸:8

通知如何共享庫被加載後的std :: multimap中的尺寸被複位!

而且,當我用一個std ::地圖,而不是一個std :: multimap中我得到一個分段錯誤:_ZSt18_Rb_tree_decrementPSt18_Rb_tree_node_base從++的libstdc so.6

幫助調試我寫的一個簡化版本的問題上述和它按預期工作,所以我假設我們的主要應用程序有一個問題,但我不知道在哪裏。我查看了編譯器和鏈接器選項,並確保測試應用程序具有相同的設置。

開發環境:
明晰構建 G ++ 4.4.3版

如果任何人有任何想法,請幫助。

+0

運行valgrind查看它彈出的位置。 – user562374 2011-01-12 13:38:00

回答

0

我只想說,你的例子是工作在我的環境很好(使用多重映射或映射數據類型):

*** Count: 1, Size: 1 
*** Count: 2, Size: 2 
*** Count: 3, Size: 3 
*** Count: 4, Size: 4 
*** Count: 5, Size: 5 
*** Count: 6, Size: 6 
*** Count: 7, Size: 7 
*** Count: 8, Size: 8 
*** Count: 9, Size: 9 
*** Count: 10, Size: 10 
*** Count: 11, Size: 11 
*** Count: 12, Size: 12 

環境:的OpenSUSE-11.3,G ++ 4.5.0,的libstdC++ so.6.0 .14

嘗試檢查您的地圖的max_size()並在每次調用時檢查insert()的錯誤代碼。