delete notwendig?



  • Vielen Dank!

    allerdings müssten evtl. die Icon Objekte auf die pointer (Icon*) verweisen gelöscht werden.

    Meinst Du damit die Objekte in den Vektoren? Wenn ja, die werden noch gebraucht und sollten nicht gelöscht werden 🙂

    Dein, musst Du nicht. Vektoren rufen beim Verlassen des Scopes in dem sie sich befinden automatisch die Destruktoren der gespeicherten Objekte auf.

    Also sollten meine Icon-Objekte sich im eignen Destructor löschen?



  • filth schrieb:

    Vielen Dank!

    allerdings müssten evtl. die Icon Objekte auf die pointer (Icon*) verweisen gelöscht werden.

    Meinst Du damit die Objekte in den Vektoren? Wenn ja, die werden noch gebraucht und sollten nicht gelöscht werden 🙂

    Dein, musst Du nicht. Vektoren rufen beim Verlassen des Scopes in dem sie sich befinden automatisch die Destruktoren der gespeicherten Objekte auf.

    Also sollten meine Icon-Objekte sich im eignen Destructor löschen?

    Ganz einfache Regel:
    Alles, was Du mit new angelegt hast, musst Du auch mit delete wieder freigeben.
    Du speicherst keine Icon-Objekte im Vektor, sondern Zeiger auf Iconobjekte. Also werden auch nie die Icon-Objekte zerstört, sondern nur die Zeiger. Wenn die Icons mit new angelegt wurden, und die Zeiger darauf zerstört wurden, bevor Du die referenzierten Objekte mit delete wieder freiegegben hast, hast Du ein Speicherleck.



  • Du solltest die Icon-Objekte dort manuell löschen wo es nötig ist. Was deine vectoren da oben von alleine löscht sind nur die Pointer, nicht die Objekte selbst.



  • Die Icon Objekte müssen beim Verlassen der Anwendung gelöscht werden.

    Der destructor sieht momentan so aus:

    // Free memory when closing
    Icon::~Icon() {
    	pTextureLoader->FreeTexture(&m_MyWallTexture);
    }
    

    Was passiert mit dem Speicher, wenn ich die Anwendung schließe und die Objekte nicht gelöscht habe? Bleibt der Speicher belegt?



  • filth schrieb:

    Die Icon Objekte müssen beim Verlassen der Anwendung gelöscht werden.

    Der destructor sieht momentan so aus:

    // Free memory when closing
    Icon::~Icon() {
    	pTextureLoader->FreeTexture(&m_MyWallTexture);
    }
    

    Was passiert mit dem Speicher, wenn ich die Anwendung schließe und die Objekte nicht gelöscht habe? Bleibt der Speicher belegt?

    Das hängt von der Plattform ab. Bei Windows werden Image/Icon-Handles nicht wieder freigegeben.
    Man sollte grundsätzlich angeforderte Ressourcen immer frei geben. Auch, wenn man weiss, dass einem das Betriebssystem hinterher räumt (z.B. bei Speicher).
    Wenn Du die Icon-Objekte mit new angelegt hast, und kein delete machst, wird der Icon-Destructor nie aufgerufen!

    Wie wird denn Dein Vektor befüllt?



  • Ok verstehe! Die Plattform ist in meinem Fall Windows.

    Wie wird denn Dein Vektor befüllt?

    Das mache ich so:

    iconPointer = new Icon("DIRECTORY", _x, _y, _z, wfd.cFileName, objectIndex);
    iconVector.push_back(iconPointer);
    


  • filth schrieb:

    Ok verstehe! Die Plattform ist in meinem Fall Windows.

    Wie wird denn Dein Vektor befüllt?

    Das mache ich so:

    iconPointer = new Icon("DIRECTORY", _x, _y, _z, wfd.cFileName, objectIndex);
    iconVector.push_back(iconPointer);
    

    Dann ist doch eigentlich klar, was zu tun ist:

    tachyon schrieb:

    Alles, was Du mit new angelegt hast, musst Du auch mit delete wieder freigeben.



  • zu schnell.. ignore me



  • So nochmal nachgedacht:

    Ich bin etwas verwirrt.

    Meine Struktur ist folgendermaßen:

    in der main erzeuge ich einen

    IconGetter myIcons;
    

    der wiederum verwaltet diesen Vektor, von dem Elemente vom Typ Icon (eigene) Klasse drin stehen.

    Muss ich dann in der "exit" - Methode der main myIcons deleten oder die einzelnen Icon-Objekte im Vektor?



  • filth schrieb:

    ...

    Alles, was Du mit new angelegt hast, musst Du auch mit delete wieder freigeben.

    Was ist daran so schwer zu verstehen?

    IconGetter myIcons; //wurde NICHT mit new angelegt, also auch kein delete
    


  • Exit Methoden sind hier fehl am Platz. Nutz einfach die Macht des Destruktors.

    Wenn du dein Objekt iconVector in einer Klasse hast, dann musst du dafür sorgen, dass, wenn das Objekt gelöscht wird auch wieder aller Speicher, den du in iconVector gesammelt hast wieder freigibst. Und das kannst du genau im Destruktor machen, dem egal ist, wie das Objekt zerstört wird (exception, am Ender der main, oder irgendwann mit einem delete). Der Destruktor wird immer aufgerufen, also musst du genau dort alle Elemente, die du per new angefordert hast und in iconVector gespeichert hast auch wieder mit delete freigeben. (ich sage micht Absicht, dass du die mit new angelegt haben mussts, da du auch ohne weiteres ein automatisches Objekt haben kannst und in iconVector schieben, was aber strengstens vermieden werden sollte. Da du im dtor ja nicht mehr weisst, welches das war und ein delete auf ein bereits gelöschtes Objekt kann fatale Folgen habe..)



  • Kapiert, danke 😃


Anmelden zum Antworten