Vector Inhalt löschen



  • Moin moin, mein Problem ist wahrscheinlich sehr einfacher Art...^^

    Naja, jedenfalls - ich habe einen Vektor, welcher nur Objekte meiner Mobile Klasse aufnehmen kann und diese möchte ich später nach Benutzung auch wieder löschen.

    vector<Mobile> mobiles;
    
    // Befuellung mit:
    
    Mobile *myMobile1 = new Mobile("Samsung", "S2", 123456);
    // ...
    
    for(int i = 0; i < mobiles.size(); i++) {
        delete mobiles.at(i);
    
    }
    

    Und diese For-Schleife geht halt nicht - mobiles ist rot unterkringelt mit dem Text:

    "std::vector<Mobile>, std::allocator<Mobile>> mobiles
    Error: Der Ausdruck muss einen Zeiger- oder Handletyp aufweisen."

    Kann mir da wer weiterhelfen?

    Gruß Zel 😉

    Edith:

    Ziel ist es ja, meine Ressourcen, die ich für jede Instanz der Klasse Mobile benötige, wieder freizugeben - das ist doch auch erreicht, wenn ich einfach den Inhalt des Vektors mittels

    mobiles.clear();
    

    lösche oder?

    Wenn ja...muss an der Zeit liegen, dass ich das erst nach meinem Post bemerkt habe...



  • Was du mit new anlegst, musst du mit delete wieder freigeben. Was du nicht mit new anlegst, musst du im Allgemeinen auch nicht mit delete freigeben. (Ausnahmen dürften dich momentan kaum interessieren)

    Aber:

    vector<Mobile> mobiles;
    

    Das sind hier keine Zeiger auf Mobile, sondern "Mobile" Objekte selbst. Damit musst du sie auch nicht manuell wieder freigeben.

    Ich wunder mich aber, warum dein Beispielcode ein new drinnen stehen hat. Woher kommt das?



  • nimm lieber einen shared_ptr, dann wird delete automatisch aufgerufen, wenn keine Referenz mehr auf das Objekt existiert. Dann reicht vector.clear() anstelle deiner Schleife.



  • daddy_felix schrieb:

    nimm lieber einen shared_ptr, dann wird delete automatisch aufgerufen, wenn keine Referenz mehr auf das Objekt existiert. Dann reicht vector.clear() anstelle deiner Schleife.

    👎

    Warum wird überall sofort shared_ptr empfohlen? shared Ownership ist ein Ausnahmefall, defaultmäßig nimmt man unique_ptr.



  • Kellerautomat schrieb:

    Warum wird überall sofort shared_ptr empfohlen? shared Ownership ist ein Ausnahmefall, defaultmäßig nimmt man unique_ptr.

    Genau. Oder gleich Boosts spezialisierte Pointer-Container, dann fällt auch die ständige Dereferenzierung weg.



  • Mach das mal lieber so:

    vector<Mobile> mobiles;
    
    // Befuellung mit:
    
    Mobile myMobile1("Samsung", "S2", 123456);
    mobiles.push_back(myMobile1);
    // ...
    

    dann brauchst Du kein delete und kannst den Vektor auch mit

    mobiles.clear();
    

    problemlos wieder löschen.



  • Kellerautomat schrieb:

    daddy_felix schrieb:

    nimm lieber einen shared_ptr, dann wird delete automatisch aufgerufen, wenn keine Referenz mehr auf das Objekt existiert. Dann reicht vector.clear() anstelle deiner Schleife.

    👎

    Warum wird überall sofort shared_ptr empfohlen? shared Ownership ist ein Ausnahmefall, defaultmäßig nimmt man unique_ptr.

    Vermutlich, weils auch Leute gibt, die sich nicht immer den modernsten Compiler aussuchen können und daher nicht auf unique_ptr zurückgreifen können.



  • Okay, ich mach das dann mal ohne new, erscheint mir für meine Zwecke doch die einfachste Lösung zu sein^^

    Vielen Dank für die Antworten 😉



  • Tachyon schrieb:

    Vermutlich, weils auch Leute gibt, die sich nicht immer den modernsten Compiler aussuchen können und daher nicht auf unique_ptr zurückgreifen können.

    Dann gibts aber auch keinen std::shared_ptr . Und wenn man Boost verwendet, kann man auch boost::scoped_ptr (ausserhalb von Containern) oder boost::ptr_vector nehmen.



  • Nexus schrieb:

    Tachyon schrieb:

    Vermutlich, weils auch Leute gibt, die sich nicht immer den modernsten Compiler aussuchen können und daher nicht auf unique_ptr zurückgreifen können.

    Dann gibts aber auch keinen std::shared_ptr . Und wenn man Boost verwendet, kann man auch boost::scoped_ptr (ausserhalb von Containern) oder boost::ptr_vector nehmen.

    Compiler, die nicht einmal TR1 unterstützen, sind aber eigentlich auch schon wieder eher selten. Und da haste dann shared_ptr.



  • Tachyon schrieb:

    Compiler, die nicht einmal TR1 unterstützen, sind aber eigentlich auch schon wieder eher selten. Und da haste dann shared_ptr.

    Bei Visual Studio 2008 musste ich damals TR1 mit dem Service Pack 1 nachrüsten, also nehme ich an, dass sowohl 2008 ohne SP als auch frühere Versionen keinen TR1 unterstützen. Spätere Versionen (ab 2010) enthalten aber wieder den C++11 std::shared_ptr .

    Keine Ahnung, wies mit g++ genau aussieht. Ich mag mich nur an einige Bugs im TR1 erinnern (besonders Random), shared_ptr funktionierte glaube ich gut.


Anmelden zum Antworten