vector und erase



  • Hallo!

    Kurze FRage:
    laut meiner Compiler-Hilfe wird bei einem vector.clear() der gesamte vector geleert und für jedes Objekt der Destruktor aufgerufen

    wie ist das bei erase?
    bzw im Spezialfall, wenn ich Zeiger auf Objekte in einem Vector habe und erase anwende?

    z.B.:

    vector<OneObject*> ObjArray;
    //Objekt anlegen; im Konstruktor des Objektes wird nochmal Speicher allokiert,
    //der im Destruktor mittels delete wieder korrekt freigegeben wird
    OneObject *einObjekt = new OneObject();
    ObjArray.push_back(einObjekt);
    // usw... z.b. 10 Objekte ins Array legen
    // blabla...
    // Das 4. Objekt herauslöschen
    ObjArray.erase(ObjArray.begin()+3);
    // wurde hier der Destruktor von einObjekt aufgerufen?
    // oder muss ich vorher ein explizites delete ObjArray[4] schreiben?
    

    Danke für die Hilfe schon mal!

    [ Dieser Beitrag wurde am 23.03.2003 um 16:10 Uhr von flosko editiert. ]



  • Im Standard wird clear über erase definiert. Daraus kann man schlußfolgern, dass auch bei erase der Destruktor aufgerufen wird.
    Im Falle von Zeigern also der nicht-existente Destruktor des Zeigers, auf keinen Fall der Destruktor des Objektes, auf das der Zeiger zeigt! Du mußt also explizit deleten.



  • Es wird nicht delete() für den Pointer aufgerufen, also auch nicht der Destruktor von *einObjekt.

    Um deiner Hilfe gerecht zu werden: Beim Löschen von Objekten aus einem std::vector wird ggf. der Destruktor des gelöschten Objekts aufgerufen. Gelöscht wird in diesem Fall aber der Pointer, _nicht_ das Objekt, auf das der Pointer zeigt. Stell dir mal vor, std::vector würde Pointer "deleten". Die Klasse wäre kaum noch zu gebrauchen!

    Stefan.


Anmelden zum Antworten