2011-01-10 86 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()的错误代码。