delete vector, aber wie wenn mehrere vectoren verschachtelt sind



  • #include <vector>
    
      vector< vector<Bestellung> > *_bestellMatrix;
      vector<Bestellung> *bestellListe;
    

    Beide Vektoren erzeuge ich mit new. Nur irgendwann muss ich ja beide wieder löschen. _bestellListe wird in _bestellMatrix gespeichert.

    Was passiert beim Löschen?
    1. Möglichkeit:

    delete _bestellMatrix;
    

    würde funktionieren, wenn dadurch _bestellListe automatisch vorher gelöscht wird.

    2. Möglichlkeit:

    delete _bestellListe;
    ....
    delete _bestellMatrix;
    

    würde zu undefinierten Verhalten führen, wenn das Programm versucht bei
    delete _bestellMatrix auch noch _bestellVektor zu löschen. Ansonsten wäre das dann richtig.

    Aber was ist nun die richtige Lösung????
    Bitte um Hilfe.

    Seid gegrüßt 🙂



  • Du kannst ein

    vector<Bestellung> *

    nicht in einem

    vector< vector<Bestellung> >

    ablegen.

    Da paßt höchstens ein

    vector<Bestellung>

    rein und in diesem Fall mußt du dich nicht manuell um die Freigabe kümmern.



  • blueheart schrieb:

    Beide Vektoren erzeuge ich mit new.

    Gibt es dafür einen triftigen Grund? vector fordert intern doch sowieso für seine Elemente dynamischen Speicher an.

    btw:
    Führende Unterstriche solltest du besser nicht verwenden und für den Compiler reserviert lassen.



  • groovemaster schrieb:

    Gibt es dafür einen triftigen Grund? vector fordert intern doch sowieso für seine Elemente dynamischen Speicher an.

    Der Speicher ist dynamisch, aber ich will den ganzen Inhalt auf den Heap verlegen, da es sich um eine Menge Daten handelt.

    groovemaster schrieb:

    Führende Unterstriche solltest du besser nicht verwenden und für den Compiler reserviert lassen.

    Tja, danke fuer den Tip, aber hier ist es Standard Membervariablen mit einem Unterstrich zu kennzeichnen



  • blueheart schrieb:

    groovemaster schrieb:

    Gibt es dafür einen triftigen Grund? vector fordert intern doch sowieso für seine Elemente dynamischen Speicher an.

    Der Speicher ist dynamisch, aber ich will den ganzen Inhalt auf den Heap verlegen, da es sich um eine Menge Daten handelt.

    So viele Zusatzdaten benötigt der vector<> nicht, daß es sich löohnt, dafür mit Pointern um sich zu schmeißen.

    Ansonsten:

    vector< vector<Bestellung> > *bestellMatrix = new vector< vector<Bestellung> >;
    vector<Bestellung> *bestellListe = new vector<Bestellung>;
    
    bestellMatrix->push_back(*bestellListe);
    

    Beim push_back() legt der vector eine Kopie des übergebenen Objektes an, das heißt, daß du die bestellListe problemlos wieder delete'n kannst.
    Problemeatisch wird es erst, wenn du einen vector<vector*> anlegst - in dem Fall enthält der nur einen Zeiger auf den von bestellListe angeforderten Speicher (aber da er den Speicher dahinter nicht selber aufräumt, ist das auch wieder deine Aufgabe - du darfst du nach dem "delete bestellListe;" nicht mehr über den vector auf deine Liste zugreifen).



  • blueheart schrieb:

    Der Speicher ist dynamisch, aber ich will den ganzen Inhalt auf den Heap verlegen, da es sich um eine Menge Daten handelt.

    Ändert aber nichts daran, dass vector für seine interne Verwaltung nur ein paar Bytes benötigt, wo es sich nicht lohnt, die extra im Freispeicher zu halten. Und wie bereits gesagt, der Inhalt von vector landet sowieso im Freispiecher.

    groovemaster schrieb:

    Tja, danke fuer den Tip, aber hier ist es Standard Membervariablen mit einem Unterstrich zu kennzeichnen

    Was meinst du mit hier? Im Forum? In der Firma? Wenn man schon einen Unterstrich verwendet, dann wird das idR nachführend gemacht.


Anmelden zum Antworten