Ich lerne ein bisschen C++ selbst, und ich bin mir nicht ganz sicher, ob ich das Speichermanagement gut beherrsche. Ich kenne nur Java und ein bisschen PHP und Python, also ist das ein bisschen neu für mich. Ich arbeite auch mit SDL - es schien eine interessante Möglichkeit zu sein, den Lernprozess zu beschleunigen. Wie auch immer, ich versuche, eine Aufräumfunktion zu schreiben, die alle Oberflächen freigibt, die an einen Stapel übergeben wurden (ich benutze nur den Stapel STL). Also, ich habe den folgenden Code (kurz):Lernen von C++ und SDL - erzeugt das folgende ein Speicherleck?
#include <stack>
//stack of SDL_Surfaces
stack<SDL_Surface*> surfaces;
void clean() {
SDL_Surface *temp = NULL;
//loops through the stack depending on its size
while (surfaces.size() != 0) {
temp = surfaces.top();
SDL_FreeSurface(temp);
surfaces.pop();
} //while
if (surfaces.size() == 0) {
cout << "cleanup worked correctly" << endl;
} //if
}
//loading an image (this is in the main function)
background = load_image("background.bmp");
surfaces.push(background);
//cleaning time
clean();
Ich bin nicht sicher über die Bereinigung Methode. Ich dachte, dies wäre ein besserer Weg, die SDL_FreeSurface-Funktion zu implementieren, anstatt jede Oberfläche manuell zu spezifizieren. Wenn ich also zehn Bilder auf den Bildschirm zeichne (sprich zehn Raumschiffe) und sie dann in die Luft sprenge, müsste ich sie richtig löschen. Ich würde für diese 10 Raumschiffe einen Stapel erstellen, und nach ihrer Zerstörung könnte ich sie alle vernichten, wenn das Sinn macht. Ich mache mir Sorgen, dass ich die Dinge übermäßig kompliziert habe und eine völlig neue Methode eingeführt habe, um Speicherlecks zu verursachen.
Jede Rückmeldung/Kommentar würde sehr geschätzt werden! Ich bin neu in C++ und verspotte meinen vergeblichen Versuch der Speicherverwaltung.
Sie möchten vielleicht den zweiten Satz umformulieren _Bedenken Sie, dass, wenn Sie den neuen Operator nicht verwenden, kein Speicherverlust auftritt. Da es nicht wahr ist, dass der neue Operator keine Speicherverluste erzeugt, es sei denn, Sie rufen danach delete auf. – ForceMagic