Wann sollte das dynamisch erstellte Singleton-Objekt gelöscht werden? Ist es wirklich notwendig, das Objekt explizit zu löschen (vom Destruktor) oder wird der nicht gelöschte Speicher vom OS/System sicher beansprucht, sobald das Programm beendet wird? Was sind die Konsequenzen, wenn es nicht gelöscht wird?Wann sollte das dynamisch erstellte Singleton-Objekt gelöscht werden?
Antwort
Im Allgemeinen wird empfohlen, das Objekt zu zerstören, wenn die Anwendung beendet wird. Wie in den Kommentaren erwähnt, werden die meisten Betriebssysteme den Speicher freigeben, wenn die Anwendung beendet wird, aber wenn Sie beispielsweise im Destruktor des Singleton bereinigen müssen, müssen Sie es selbst bereinigen (Betriebssystembereinigung ruft den Destruktor nicht auf) .
Normalerweise lösche ich es kurz bevor meine Anwendung beendet, aber das ist nicht immer die beste Lösung. Ich habe festgestellt, dass in einigen Fällen der Singleton nur zum Löschen erstellt oder nach dem Löschen zugegriffen wird und neu erstellt wird.
Sie können die Funktion atexit()
verwenden, um eine Bereinigungsfunktion zu registrieren, wenn das Singleton erstellt wird. Zum Beispiel:
static Singleton* s_instance = nullptr;
void cleanupSingleton() {
delete s_instance;
}
class Singleton {
public:
static Singleton* instance() {
if(s_instance == nullptr) {
s_instance = new Singleton();
std::atexit(cleanupSingleton);
}
return s_instance;
}
};
PS: nicht das beste, Thread-sicher Singleton Beispiel, aber gut genug für das Beispiel.
Weitere Informationen finden Sie einige Hinweise auf die atexit()
Funktion: cplusplus.com oder cppreference.com
Wenn Sie Singleton verwenden, Singletons Meyers verwenden:
class Singleton {
public:
static Singleton& instance() {
static Singleton s_instance;
return s_instance;
}
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
private:
Singleton() = default;
~Singleton() { /* Your clean up code */ }
};
Destructor würde automatisch nach der Haupt Enden bezeichnet werden.
- 1. Wann dynamisch erstellte Objekte freigegeben werden sollen
- 2. Wann sollte das Schlüsselwort "as" und wann() Casting verwendet werden?
- 3. Wann kann das lokale Maven-Repository sicher gelöscht werden?
- 4. Wann sollte StringBuilder verwendet werden?
- 5. Wann sollte IDisposable implementiert werden?
- 6. Wann sollte FOUNDATION_EXPORT verwendet werden?
- 7. Wann sollte WS_EX_NOREDIRECTIONBITMAP verwendet werden?
- 8. Wann sollte curl_close() verwendet werden?
- 9. Wann sollte $ .extend ({...}) verwendet werden?
- 10. Wann sollte range.value verwendet werden?
- 11. Wann sollte wkWebView verwendet werden?
- 12. Wann sollte plist verwendet werden?
- 13. Wann sollte Flask.g verwendet werden?
- 14. Wie sollte das Sstate-Cache-Verzeichnis in Yocto gelöscht werden?
- 15. Wann kann der lokale Zweig gelöscht werden?
- 16. Ember: Dynamisch erstellte Komponentenaktionen werden nicht ausgelöst
- 17. Wann luabind frei erstellte Objekte?
- 18. Dynamisch erstellte Steuerelemente in UpdatePanel?
- 19. Automatisch erstellte Statistiken werden nicht von Sql Server 2008 gelöscht
- 20. PHP Erstellte Datei | SSH kann nicht gelöscht werden (Berechtigung verweigert)
- 21. ASP.NET - Dynamisch erstellte Schaltfläche
- 22. Wann wird Default.png gelöscht?
- 23. Wann sollte 'Array.prototype' verwendet werden und wann sollte 'this' in JavaScript verwendet werden?
- 24. zurück dynamisch erstellte Funktion
- 25. Dynamisch erstellte Tabellenabfragen
- 26. Wann sollte dynamic_cast der Referenz verwendet werden?
- 27. Dynamisch erstellte Wörterbücher aufrufen
- 28. Wann sollte ein neuer Ausnahmetyp verwendet werden?
- 29. Wann sollte ein Singleton verwendet werden?
- 30. Wann sollte ein Event Bus verwendet werden?
Auf einem System, auf dem das Betriebssystem Ihren Speicher freigibt, ist es kostenlos, wenn der Prozess beendet wird. Wenn nicht, dann müssen Sie es selbst befreien. Führt der Singleton-Destruktor auch alles aus, was vor dem Beenden des Prozesses benötigt wird? Dann müssen Sie das Objekt explizit löschen. Oder denken Sie an ein Design, bei dem Sie nicht wirklich ein Singleton brauchen, vor allem kein dynamisch zugewiesenes. –
Es kommt darauf an. Was ist das konkrete Problem? –
@ Cheersandhth.-Alf Die Singleton-Klasse verfügt über eine Membervariable (Objekt der anderen Klasse), die Speicher dynamisch zuweist und sie aus dem Desturutor löscht. Aber ich sehe kein explizites Löschen des Singleton-Objekts. Grundsätzlich wollte ich wissen, was mit der Member-Variable passiert, wenn ich das Singleton-Objekt explizit lösche oder nicht lösche. – Sitesh