vector.clear() was wird aufgeräumt?



  • Also ich bin gerade so am Überlegen, inwiefern denn bei diesem Konstrukt

    vector<myClass*> liste;
    

    sich ein clear auf die Listeninhalte auswirkt.
    In der Doku die ich bisher gefunden habe steht leider nicht besonders viel dazu.
    Aaalso. werden die Elemente bei .clear() wirklich gelöscht oder nur deren Zuordnung zum Vector. Immerhin müsste man sie ja im letzteren Falle selber mit delete entfernen..



  • DocJunioR schrieb:

    Aaalso. werden die Elemente bei .clear() wirklich gelöscht oder nur deren Zuordnung zum Vector.

    Clear löscht die Elemente wirklich. Aber in deinem Fall sind die Elemente Zeiger. Die Zeiger werden gelöscht, nicht das, worauf sie möglicherweise zeigen.

    Eine "Zuordnung" gibt es nicht, der Vector besitzt seine Elemente.



  • Hallo,

    Hier wird kein delete aufgerufen. Das mußt du schon selber machen. Eine Alternative wäre boost::ptr_vector.



  • Aahja, gut zu wissen.
    schankedön



  • die container bei der STL loeschen prinzipiell nur was sie selbst anlegen.
    Deswegen gibt es ja auch fuer die datenklassen die Anforderung, das sie Copyconstruierbar sind .... also fuer dein T ein
    T c(i);
    oder T * pr = new(i);
    oder wie der speichermanager intern auch immer funktioniert ....

    funktionieren muss.

    Alle plain old datatypes koennen das, Zeiger damit natuerlich auch.

    Auf was der zeiger zeigt, will der container hingegen nicht interpretieren wollen. Deshalb fasst er es auch mit nem delete nicht an ...

    also ein

    std::vector<Myclass *> mptrList;
    
    Myclass var; 
    
    mptrList.insert(&var); 
    mptrlist.clear();
    

    funktioniert auch ohne segmentation fault ^^
    Ist auch gut so, das macht die stl viel universeller anwendbar ...
    Das aufraeumen selber implementieren zu muessen ist nur nen geringer preis dafuer.
    BTW die QT hat das autodelete auch wieder aus ihren containern rausgenommen ...

    BTW sollt man in C++ sowieso nicht so viel mit raw zeiger arbeiten ....

    warum schiesst du deine klasseninstanzen selber auf den heap ?
    lass es doch lieber die stl machen, deren Speichermanager iss auch besser an den container oiptimiert, wo den speicher dann doch als zeiger reinlegst?

    Wenn du nicht willst, das deine Addressen, also die zeiger, ungueltig werden weil sich der container neu kopiert, durch ein resize beim vetor z.b., dann nimm ne liste, und speicher im vector nur noch die adressen ....

    Ciao ...



  • RHBaum schrieb:

    warum schiesst du deine klasseninstanzen selber auf den heap ?
    lass es doch lieber die stl machen, deren Speichermanager iss auch besser an den container oiptimiert, wo den speicher dann doch als zeiger reinlegst?

    Da würden mir durchaus ein paar Gründe einfallen.

    @Doc: Wenn du dir sicher sein willst, daß beim clear() die Pointerdaten gelöscht werden, nimm Smart-Pointer anstelle blanker Pointer (z.B. boost::shared_btr)

    (ganz wichtig: std::auto_ptr ist NICHT geeignet)



  • Da würden mir durchaus ein paar Gründe einfallen.

    ja sicher, es gibt immer Gruende ^^

    Aber eine Loesung fuer c++ auf elegante weisse aufwendigere objecte die man nicht aufn stack anlegen will/darf, zu umgehen, hasst ja schon genannt ^^

    Geht ja nicht darum dass ein:
    T * ptr = new T; // oder was weiss ich fuer construktor ...
    immer boese ist, sondern man sollt sich halt nur Gedanken zu machen ob man das halt ned besser sauberer fehlerunanfaelliger machen kann ....
    und manchmal geht es eben wirklich nicht besser, und manchmal isses auch schlicht zu aufwendig ...

    Ciao ...


Anmelden zum Antworten