我目前正在加载包含全局操作存储(这是该功能的简化视图)的共享库的应用程序。在一个非常简单的看法,这是我有:加载共享库时全局变量重置
共享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