static std::map
-
Bitte etwas mehr Code zeigen. Dein myMap ist nur eine Deklaration. Gestern gabs ein ähnliches Thema mit static-Objekten.
-
// Global.h #ifndef GLOBAL_H #define GLOBAL_H #include <map> typedef std::map<const char *, int> Addresses; static Addresses addresses; #endif /* GLOBAL_H */// Main.cpp #include "Global.h" int main(int argc, char *argv[]) { addresses.insert(std::make_pair("localhost", 0)); std::cout << addresses.size() << std::endl; runThreads(); }Ich gebe anschließend nochmal ( z.B. in runThread() ) addresses.size() aus, aberes erscheint plötzlich 0... Die Liste ist aufeinmal leer. Warum? Wie kann ich das beheben?
-
Static bedeutet bei globalen Variablen, daß die Variablen nur innerhalb einer Übersetzungseinheit sichtbar sind. Wenn du das so in den Header schreibst, bekommt demnach jede Übersetzungseinheit eine "eigene" myMap.
Die Lösung wäre, die Map z.B. in Main.cpp zu definieren (aber nicht static!), und in die global.h kommt dann eine Deklaration als extern.
// Main.cpp std::map<std::string, int> myMap; --- // global.h extern std::map<std::string, int> myMap;
-
Das klappt perfekt. Vieeeeeeeeeeeeeeeeeelen Dank

-
Mappy schrieb:
Genauer: Ich habe einige Threads in denen auf diese std::map zugegriffen werden
dann solltest du sie unbedingt als volatile qualifizieren ...
-
globale variablen sind sone Sache. Man könnte auch sagen: pfui!
Gerade wenn du mit mehreren Threads drauf zugreifen willst wäre es evtl. sinnvoll, die geschichte in eine Singleton-Klasse zu wrappen, die dann auch gleich die parallelen Zugriffe mit regelt.
-
Paul Manns schrieb:
Mappy schrieb:
Genauer: Ich habe einige Threads in denen auf diese std::map zugegriffen werden
dann solltest du sie unbedingt als volatile qualifizieren ...
http://www.c-plusplus.net/forum/viewtopic-var-p-is-1580903.html#1580903
Woher kommt eigentlich dieser Irrglaube?
Grüssli
-
Dravere schrieb:
Paul Manns schrieb:
Mappy schrieb:
Genauer: Ich habe einige Threads in denen auf diese std::map zugegriffen werden
dann solltest du sie unbedingt als volatile qualifizieren ...
http://www.c-plusplus.net/forum/viewtopic-var-p-is-1580903.html#1580903
Woher kommt eigentlich dieser Irrglaube?
Ganz klar: Aus der Vorstellung jedes standard Schlüsselwort in C++ müsste einen Sinn haben. volatile hat in reinem standard C++ aber legentlich die Funktion eines überflüssigen Typ-Modifiers.
-
Sorry, double post.
-
Ich würde auf jeden Fall pumuckls Tipp berücksichtigen. Globale Variablen sind nicht nur problematisch, wenn man sie in mehreren Threads verwenden will, sondern auch, wenn andere globale Variablen sie benutzen sollen.
Ich würde da das COFU-Idiom benutzen (meinetwegen auch Meyers-Singleton):typedef std::map<std::string, int> AddressesType; AddressesType& getInstance() { static AddressesType addresses; return addresses; }So wird sichergestellt, das die AddressesType-Instanz auch existiert, wenn Du sie benötigst.