instanzen löschen oder nicht?



  • Hallo,

    ich habe da mal eine frage. Muß ich nachdem ich zur laufzeit ein Objekt erstellt habe diese auch wieder löschen? Ich habe schon zwei varianten gehört. Der eine sagt ja und der andere nein.

    z.bsp.

    TTable *Table1 = new TTable(this);
    ......
    delete Table1;

    muß dass delete da stehen oder reicht es wenn ich die Tabelle einfach auf Active->False setze?



  • wenn du mit new eine instanz erstellst, dann musst du diese mit delete (einfache instanz) bzw. delete [] (array) wieder freigeben, da du ja speicher auf dem heap belegst und dieser nicht automatisch freigegeben wird!

    int *a = new int;
    
    delete a;
    
    // bzw.
    
    int *a = new int[10];
    
    delete [] a;
    

    nichts falsch machen kannst du, wenn du das immer freigibst und zwar wie folgt:

    [cpp]
    // guggen ob **a != NULL ist
    **if (a)
    {
    // wenn ja freigeben (mit delete bzw. delete [])
    delete a;
    a = NULL;
    }[/cpp]

    genau so machst du das mit dem TTable, musst halt nur guggen, ob du danach noch drauf zu greifst, wenn du ihn freigibst.

    [ Dieser Beitrag wurde am 19.02.2003 um 10:14 Uhr von Sunday editiert. ]



  • Das sind doch zwei verschiedene paar Schuhe.

    Grundsätzlich:
    Wenn du zur Laufzeit ein Objekt mit new auf dem Heap erzeugst,
    dann musst du es auch selbst wieder mit delete löschen.

    In deinem Beispiel:
    Durch das Setzen von Active=false sagst du ja nur, dass die Verbindung zur Tabelle getrennt werden soll, das Objekt bleibt aber weiterhin bestehen!



  • "Mit dem Operator new kann man während der Laufzeit eines Programms peicherplatz reservieren. Dieser Operator versucht, in einem eigens dafür vorgesehenen Speicherbereich (dem so genannten Heap) so viele Bytes zu reservieren, wie eine Variable des angegebenen Datentyps benötigt.

    Falls der angeforderte Speicher zur Verfügung gestellt werden konnte, liefert new die Adresse des Speicherbereichs. Andernfalls wird die Exception std::bad_alloc ausgelöst, die einen Programmabbruch zur Folge hat, wenn sie nicht mit den Techniken des Exception-Handlings abgefangen wird.
    Da unter den 32-bit-Systemen von Windows unabhängig vom physisch vorhandenen
    Hauptspeicher 2 GB virtueller Speicher zur Verfügung stehen, kann man
    meist davon ausgehen, dass der angeforderte Speicher verfügbar ist.

    Den Operator delete sollte man immer aufrufen, sobald eine mit new erzeugte
    Variable nicht mehr benötigt wird. Man verhindert so, dass nicht mehr benötigte
    Speicherbereiche unnötig reserviert werden und so die Leistungsfähigkeit eines
    Systems grundlos beeinträchtigt wird. Ganz generell gilt: Jede mit new erzeugte
    Variable sollte auch wieder freigegeben werden."

    aus: Richard Kaiser - C++ mit dem Borland C++Builder



  • Stop! TComponent-Derived-Klassen müssen nicht freigegeben werden, wenn beim Erstellen der Parameter AOwner auf ein Objekt von TComponent zeigt. In diesem Falle ist dann die Owner-Komponente für das Löschen zuständig. (Nachzulesen in der Dokumentation der Basisklasse TComponent in der VCL-Referenz)

    Grundsätzlich ist aber richtig: (abgesehen von dieser Ausnahme) was mit "new" bzw. "new []" erstellt wird muss mit "delete" bzw "delete []" freigegeben werden.

    -junix

    <edit>Als Entscheidungsgrundlage sollte immer die Dokumentation des Konstruktors der jeweiligen Komponente dienen. Dort ist jeweils angegeben werd für das Löschen verantwortlich ist.</edit>

    [ Dieser Beitrag wurde am 19.02.2003 um 10:26 Uhr von junix editiert. ]



  • Original erstellt von junix:
    TComponent-Derived-Klassen müssen nicht freigegeben werden, wenn beim Erstellen der Parameter AOwner auf ein Objekt von TComponent zeigt.

    Das sollte vielleicht eher so betont werden: TComponent-Derived-Klassen müssen nicht freigegeben werden, wenn ...

    Wenn man die Instanzen während des weiteren Programmablaufes nicht mehr benötigt sollte man sie ruhig löschen, auch wenn sie einen Owner haben, da sie ja sonst wie schon gesagt nur sinnlos Speicher verbrauchen.

    Man kann sich aber zB. das explizite Löschen beim Beenden des Programmes sparen, das geschieht dann automatisch.


Anmelden zum Antworten