erase bei map und vector - Elemente gelöscht oder nicht?



  • Hallo zusammen,

    habe ein Problem mit genannter Methode.

    Laut Beschreibung löscht die Methode das Element und entfernt es aus dem Container. Das muss ja dann auch für clear() gelten.

    Nun hab ich folgende Konstruktionen:

    vector<MyObject *> vec;
    map<int, MyObject1 *> m;
    
    ... // Einfügen von Zeigern dynamisch mit new angelegter Objekte
    ... // im Destruktor dieser Klasse dann
    
    vec.clear();
    m.clear();
    

    Nun werden die clear()-Methoden zwar ausgeführt, aber die Destruktoren der Elementobjekte, deren Zeiger eingetragen sind werden nicht gerufen!
    Ich dachte clear() bzw. erase löschen die Elemente vor dem Entfernen?

    Muss ich dann die Container durchlaufen, für jedes Element delete rufen und danach erst clear()? Dann würden aber die Zeiger im Container auf ungültige Adressen verweisen, oder nicht?

    Danke schon mal
    Ciao



  • Reth schrieb:

    Muss ich dann die Container durchlaufen, für jedes Element delete rufen und danach erst clear()?

    ja

    Reth schrieb:

    Ich dachte clear() bzw. erase löschen die Elemente vor dem Entfernen?

    nur objekte keine objektzeiger



  • Die Container rufen nur die Destruktoren der eingebundenen Objekte auf - und ein blanker Pointer kümmert sich nicht selber um das delete. Also bleibt dir nur übrig, entweder von Hand alle Elemente zu delete'n, bevor du erase()/clear() aufrufst, oder einen Smart-Pointer zu verwenden, der sich darum kümmert (z.B. boost::shared_ptr).

    (PS: auto_ptr ist nicht geeignet)


Anmelden zum Antworten