std static map unique_ptr in Klasse richtig freigeben?
-
Hiho,
Ich hab derzeit ein Problem, mit einem Fehler wenn ich das Programm beende.
Folgende Klasse:
Klasse
// Klasse.h class Klasse { protected: typedef std::unordered_map<unsigned long, std::unique_ptr<Object>> ListType; public: static ListType list; }; // Klasse.cpp Klasse::ListType Klasse::list;Nun füge ich später Elemente in die Liste und lösche diese wieder. Das geht alles auch. Jedoch bekomme ich immer einen Fehler (welchen ich leider nicht wiedergeben kann). Es hat aber wohl mit der static unique_ptr liste zu tun. Tausche ich diese gegen normalen Object* liste, bleibt der Fehler aus. Nun bin ich soweit das der Fehler nicht kommt, wenn ich beim beenden des Programmes
Klasse::list.clear()
mache. Aber warum ist die frage, ich dachte durch den unique_ptr wird eh dafür gesorgt das alle Ressourcen wieder frei gegeben werden. Anderer seits, denke ich auch das durch das static das Programm nicht weis wann die Ressourcen wieder frei zu geben sind.
Jetzt also die frage, wie muss man es richtig machen? Wie "lösche" ich die static unique_ptr map ganz sauber und ordentlich.
mfg Spoocy
-
Wenn du uns die Fehlermeldung nicht liefern kannst, koennen wir auch nur Kristallkugelmutmassungen betreiben; dass das Symptom aber bei Verwendung von Plain Pointers, welche unter Beruecksichtigung der Aussage, dass du sie wegen des Cleans durch uniques ersetzen wolltest, offensichtlich nicht freigegeben werden (bzw. die Objekte, auf die sie zeigen), klingt das ganze eher so, als wuerdest du noch auf schon zerstoerten Objekten arbeiten.
Dass ein explizites Clear da hilft, passt zwar nicht ganz, aber die Frage ist auch, was genau einObjectmacht. Kann es sein, dass das im Destruktor noch an der Liste herumfummeln will (zumal die Variable auch noch public ist)?Wie dem auch sei, koennte auch etwas in Richtung [c]static initialization order fiasco[/c]; du kannst nicht vorhersagen, in welcher Reihenfolge statische Klassenvariablen (nicht statische Variablen innerhalb von Funktionen) konstruiert und auch geloescht werden. Statische Klassenvariablen solltest du im Prinzip mit demselben Respekt wie globale Variabeln behandeln, anders gesagt: Nutze sie nicht, ausser du hast einen sehr sehr triftigen Grund.Trotzdem waere es vielleicht hilfreich, wenn du mal versuchen koenntest, mit Debugger die Fehlermeldung zu kriegen.
Man koennte versuchen, die Variable in eine statische Funktion wegzukapseln (--> Initialisierungsreihenfolge definiert), allerdings schafft das dein vermutliches Designproblem nicht aus der Welt und ob es in deinem Falle was bringen wuerde, ist auch fraglich.
Wenn du in den Destruktoren der Objekte auf der Liste rumfummelst, die sich gerade selbst schon in der Zerstoerung befindet, kann nichts gutes bei rauskommen...
unique_ptrsorgt dafuer, dass die Zerstoerung der Objekte ohne dein Zutun garantiert angestossen wird, er korrigiert nicht auf magische Weise einen Logikfehler im DestruktorEDIT: Bei weiterem nachdenken erscheint mir ein Fehler beim Zerstoeren doch wesentlich wahrscheinlicher als SIOF.