現在、グローバル操作ストアを含む共有ライブラリをロードするアプリケーションで作業しています(これは機能の簡略化された表示です)。非常に単純化されたビューでは、これは私が持っているものです:共有ライブラリをロードするときにグローバル変数がリセットされる
共有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
数:9、サイズ:5
---数:10、サイズ:6
---数:11、サイズ:7
---数:12、サイズ:STD ::マルチマップのサイズは、共有ライブラリがロードされた後にリセットされるか8
お知らせ!また
、私はSTDを使用::の代わりにのstdのマップは:: multimapの私がでセグメンテーションフォールトを取得:。にlibstdC++から_ZSt18_Rb_tree_decrementPSt18_Rb_tree_node_baseをso.6
私はの簡易版を書いた問題をデバッグするには上記のとおり、それは期待どおりに動作するので、私は主なアプリケーションに問題があると仮定していますが、実際にはどこにいるのかわかりません。私はコンパイラとリンカのオプションを見て、テストアプリケーションの設定が同じであることを確認しました。
開発環境:
明快ビルド G ++バージョン4.4.3
誰が助けてください任意のアイデアを持っている場合。
valgrindを実行して、どこから爆発するかを確認します。 – user562374