我目前正在加載包含全局操作存儲(這是該功能的簡化視圖)的共享庫的應用程序。在一個非常簡單的看法,這是我有:加載共享庫時全局變量重置
共享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版
如果任何人有任何想法,請幫助。
運行valgrind查看它彈出的位置。 – user562374 2011-01-12 13:38:00