class-vector + new?



  • Was ist der Unterschied zwischen

    class cText
    {
    
    };
    std::vector<cText> v1;
    

    und

    class  cText
    {
    
    };
    std::vector<cText*> v2;
    
    v2.resize(1);
    v2[0]=new cText;
    

    und, wie lösche ich v2,

    dank,

    Chrissi



  • v2 wird automatisch "gelöscht".

    Das Objekt, was darin ist per delete.

    delete v2[0];
    

    Und ich würde

    v2.resize(1); 
    v2[0]=new cText;
    

    durch

    v2.push_back (new cText);
    

    ersetzen



  • Aber wo ist der unterschied?



  • Der Zeiger kann auf alles Zeigen, nicht zwangsweise auf ein extra dafür angelegtes Objekt:

    {
       cText foo;
    
       v2.push_back(&foo);
       ...
    }
    

    Würde ich aber nicht machen.

    Wichtiger ist aber wohl: Wenn du den Vector Kopierst werden die Adressen Kopiert, nicht aber die dahinter steckenden Objekte.



  • Außerdem wenn du bei dem Zeiger-Vector die Objekte veränderst in der art von

    v2[0]->aenderIrgendEinWert();

    dann verändert sich auch das Objekt "außerhalb" des Vektors



  • Der Unterschied ist, dass du das zweite IMHO lieber sein lässt 🙂
    vector<cText*> ist die beste Wahl, wenn man Zeiger auf Objekte ansammeln will, deren Lebenszeit *anderswo* gemanaget wird. Aber die Objekte im Container über delete selber zu löschen ist meistens ziemlich unsauber.
    Wenn vector<cText> nicht geht, weil du Polymorphie brauchst (die nur mit Zeigern geht) oder du nicht willst, dass die Objekte vom vector kopiert werden oder du die Elemente gleichzeitig in mehreren Containern haben willst, lebst du am sichersten mit einem Container aus referenzgezählten Zeigern, z.B. vector<boost::shared_ptr<cText> > (www.boost.org).


Anmelden zum Antworten