2011-01-10 8 views
0

Ich arbeite derzeit an einer Anwendung, die eine gemeinsam genutzte Bibliothek lädt, die einen globalen Speicher von Operationen enthält (dies ist eine vereinfachte Ansicht der Funktion). In einer sehr vereinfachten Sicht ist das, was ich habe:Globale Variablen zurückgesetzt beim Laden einer gemeinsam genutzten Bibliothek

Die gemeinsame libary hat eine Klasse, die die in dem Laden registriert und sieht etwas ähnliches wie:

// 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; 

Es gibt auch mehrere CPP Dateien innerhalb der Bibliothek, die Operationen registriert. Die Registrierung erfolgt wie folgt:

Beim Ausführen der Hauptanwendung wird die Bibliothek als Abhängigkeit geladen. Die Hauptanwendung selbst hat einige .cpp, die Operationen registriert.

Die Ausgabe erhalte ich, wenn ich diesen Code ausführen:
--- Anzahl: 1, Größe: 1
--- Anzahl: 2, Größe: 2
--- Anzahl: 3, Größe: 3
--- Anzahl: 4, Größe: 4
--- Anzahl: 5, Größe: 1
--- Anzahl: 6, Größe: 2
--- Count: 7, Größe: 3
--- Anzahl: 8, Größe: 4
--- Anzahl: 9, Größe: 5
--- Anzahl: 10, Größe: 6
--- Anzahl: 11, Größe: 7
--- Anzahl: 12, Größe: 8

Beachten Sie, wie die Größe des std :: multimap zurückgesetzt wird, nachdem die gemeinsame Bibliothek geladen wird!

Auch wenn benutzte ich eine std :: map statt einer std :: multimap ich einen Segmentation Fault zu bekommen. _ZSt18_Rb_tree_decrementPSt18_Rb_tree_node_base von libstdC++ so.6

debuggen Um das Problem zu helfen, wie ich eine vereinfachte Version geschrieben das oben und es funktioniert wie erwartet, also nehme ich an, dass es ein Problem mit unserer Hauptanwendung gibt, aber ich weiß nicht wirklich wo. Ich habe mir die Compiler- und Linker-Optionen angesehen und sichergestellt, dass die Testanwendung die gleichen Einstellungen hat.

Entwicklungsumgebung:
luziden build g ++ Version 4.4.3

Wenn jemand eine Idee hat, bitte helfen Sie.

+0

Run Valgrind, um zu sehen, wo es bombardiert. – user562374

Antwort

0

Ich möchte nur sagen, dass Ihr Beispiel fein in meiner Umgebung arbeitet (multimap oder Kartendatentypen):

*** 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 

. Umgebung: OpenSUSE-11.3 g ++ 4.5.0, libstdC++ so.6.0 .14 ​​

Versuchen Sie, max_size() Ihrer Karte zu überprüfen und überprüfen Sie bei jedem Aufruf den Fehlercode von insert().

Verwandte Themen