加载共享库时全局变量重置

时间:2011-01-10 02:41:42

标签: c++ shared-libraries

我目前正在开发一个应用程序,它加载一个包含全局操作存储的共享库(这是该功能的简化视图)。在一个非常简化的视图中,这就是我所拥有的:

共享库有一个类,它在商店中注册操作,看起来类似于:

// 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 :: map而不是std :: multimap时,我在libstdc ++中发现了一个分段错误:_ZSt18_Rb_tree_decrementPSt18_Rb_tree_node_base。so.6

为了帮助调试问题,我写了上面的简化版本,它按预期工作,所以我假设我们的主应用程序存在问题,但我真的不知道在哪里。我查看了编译器和链接器选项,并确保测试应用程序具有相同的设置。

开发环境:
清晰的构建 g ++版本4.4.3

如果有任何想法请帮助。

1 个答案:

答案 0 :(得分: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()的错误代码。