Wie dynamischen Speicher einer statischen Variablen freigeben?
-
Moin zusammen,
ich habe eine Funktion die etwa folgendermaßen aussieht:
std::set<std::string> const & f() { static std::set<std::string> *p = 0; if (p == 0) { p = new std::set<std::string>; *p.insert(...); . . . } return *p; }Wie kann ich nun den mit new allokierten Speicher wieder freigeben? Ein Ansatz wäre, eine Klasse um die Funktion herumzubauen, so das der Destruktor den Speicherplatz wieder freigeben kann.
class C { private: static std::set<std::string> *p = 0; public: C() { if (p == 0) { p = new std::set<std::string>; *p.insert(...); . . . } } ~C() { if (p != 0) delete p; } std::set<std::string> const & f() { if (p == 0) { p = new std::set<std::string>; *p.insert(...); . . . } return *p; } };Was mir an der Lösung jedoch nicht gefällt ist, dass ich stets eine Instanz der Klasse brauche. Dabei würde es mir im Grunde reichen, wenn C::f statisch wäre. Wenn ich aber C::f nur statisch verwende, dann wird wieder kein Destruktor aufgerufen, der mir den Speicher freigeben würde.
Was ist also des Rätselts Lösung? Freue mich auf Antworten.
Gruß
Paul
-
Warum benutzt du überhaupt new? Machs doch so:
std::set<std::string> initFunction() { std::set<std::string> p; // Ist wegen NRVO nicht teuer p.insert(...); ... return p; } const std::set<std::string>& f() { static std::set<std::string> p = initFunction(); return p; }
-
Das war jetzt zu einfach.

Vielen Dank!