2011-01-10 11 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
数: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

誰が助けてください任意のアイデアを持っている場合。

+0

valgrindを実行して、どこから爆発するかを確認します。 – user562374

答えて

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()のエラーコードを確認してください。

関連する問題