std::vector als "behaelter" für std::vector



  • Hallo allerseits,

    Würde folgender Code zu einem Speicherleck führen?

    std::vector<std::vector<int> > A;

    std::vector<int>* p_element = new std::vector<int>(1);
    (*p_element)[0] = 42;

    A.push_back(*p_element);

    /* Meine Annahme ist, dass im Folgenden zuerst die Destruktoren
    der std::vector-Elemente von A aufgerufen werden und danach
    der Destruktor von A. Da ich oben keinen Zeiger auf eine
    std::vector-Instanz abspeichere, sondern die Instanz selber,
    sollte es doch so ablaufen, oder nicht? */

    A.clear();

    Gruß
    reg



  • std::vector speichert Kopien, keine Referenzen. p_element wird auf diese Weise speichergeleckt; seine Kopie, die von A gehalten wird, wird ordnungsgemäß zerstört.

    Allerdings kannst du Folgendes machen:

    std::vector<std::vector<int> > A;
    std::vector<int> p_element;
    
    p_element.push_back(42);
    A.push_back(p_element);
    

    Natürlich ginge auch einfach

    std::vector<std::vector<int> > A(1);
    A[0].push_back(42);
    


  • Hallo seldon,

    Ich wusste gar nicht, dass std::vector Kopien anderer Objekte macht. Aber in meinem Programm hat es nun tatsächlich auch ohne Zeiger und new() funktioniert. Dadurch vereinfacht sich auch der Code und wird übersichtlicher.

    Vielen Dank!

    Gruß
    reg



  • Du solltest manuelle Speicherverwaltung so oft wie möglich vermeiden. Sie ist nur selten wirklich nötig, und die dadurch entstehenden Probleme lohnen sich einfach nicht. Gerade wenn C++ bessere Techniken wie RAII bietet.

    Falls du doch einmal Zeiger in Containern brauchst (z.B. wegen Polymorphie oder nicht-kopierbaren Objekten), könntest du dir überlegen, die Bibliothek Boost.PointerContainers anzuschauen.


Anmelden zum Antworten