Bereinigung in der Shutdown () -Methode anstelle des Destruktors

ImRastertek DirectX-Tutorials Sie haben leere Konstruktoren und Destruktoren und verwenden stattdesseninitialize() undshutdown() Funktionen zur Initialisierung und Bereinigung von Objekten. Nachdem ich dieses Design für eine Weile benutzt habe, kann ich die Vorteile von ein wenig versteheninitialize() Methode, aber ich kann nicht sehen, wie mit einemshutdown() Methode ist besser, als den gesamten Bereinigungscode in den Destruktor zu schreiben.

Der Grund dafür ist folgender:

Sie werden auch feststellen, dass ich im Klassendestruktor keine Objektbereinigung durchführe. Ich räume stattdessen mein gesamtes Objekt in der Shutdown-Funktion auf, die Sie weiter unten sehen. Der Grund dafür ist, dass ich nicht vertraue, dass es angerufen wird. Bestimmte Windows-Funktionen wie ExitThread () rufen Ihre Klassendestruktoren bekanntermaßen nicht auf, was zu Speicherverlusten führt. Natürlich können Sie jetzt sicherere Versionen dieser Funktionen aufrufen, aber ich bin nur vorsichtig, wenn ich unter Windows programmiere.

Das allgemeine Verwendungsmuster sieht also so aus:

class Renderer
{
public:
    Renderer() { }
    ~Renderer() { }

    bool initialize(...) { /* perform initialization */ }
    void shutdown() { /* clean-up */ }
}; 

Renderer* renderer = new Renderer;
renderer->initialize(...);

// use the renderer

renderer->shutdown();
delete renderer;
renderer = NULL;

Wenn ich mir den Code von Rastertek ansehe, scheint es mir, dass sie aus dem C-Hintergrund stammen (alle Variablen oben in der Funktion initialisieren, nur rohe Zeiger und rohe Arrays verwenden usw.), also frage ich mich, ob dies noch eine andere Sache ist in modernem C ++ unnötig (zum einen erschwert es die Verwendung von intelligenten Zeigern). Gibt es einen wirklichen Vorteil für dieses Design?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage