2016-08-23 1 views
0

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?

+0

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. –

+1

Es kommt darauf an. Was ist das konkrete Problem? –

+0

@ 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

Antwort

1

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

1

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.

Verwandte Themen