map: swap und zerstörtes Objekt



  • Mahlzeit!

    Wenn ich 2 maps habe und die 2 swappe:

    m1.swap(m2);
    

    Ist dann m1 noch gültig (intakt und benutzbar), wenn m2 zerstört wird?



  • ja



  • Heisst das dann swap erzeugt eine Deep Copy?



  • bakkuu schrieb:

    Heisst das dann swap erzeugt eine Deep Copy?

    Du kannst dir bei allen Typen in der Standardbibliothek sicher sein, dass eine Kopie auch wirklich eine deep copy ist.
    swap selber erzeugt keien deep copy, weil es wesentlich schnellere und einfacherer Wege gibt, es durchzuführen.



  • bakkuu schrieb:

    Heisst das dann swap erzeugt eine Deep Copy?

    Da es nichts kopiert sicher nicht.



  • manni66 schrieb:

    bakkuu schrieb:

    Heisst das dann swap erzeugt eine Deep Copy?

    Da es nichts kopiert sicher nicht.

    Wie kann dann m1 weiterhin valide sein, wenn nichts kopiert wird und m2 zerstoert wird?? 😕



  • Was glaubst du, was swap tut?



  • bakkuu schrieb:

    Mahlzeit!

    Wenn ich 2 maps habe und die 2 swappe:

    m1.swap(m2);
    

    Ist dann m1 noch gültig (intakt und benutzbar), wenn m2 zerstört wird?

    m1 und m2 sind 2 verschiedene Variable. Wenn m2 zerstört wird, hat das mit m1 so gar nichts zu tun. Das gilt auch, nachdem m1 den Wert von m2 übernommen hat und umgekehrt.

    Du hast allerdings nicht gesagt, welchen Typ m1 und m2 haben und wie die swap-Methode von m1 implementiert ist. Ich gehe einfach mal davon aus, dass die swap-Methode das macht, was man von ihr erwartet.

    Es stellt sich allerdings die Frage, wie Du m2 zerstörst. So wie Du das geschrieben hast, ist m2 vermutlich eine lokale Variable. Die wird automatisch zerstört, wenn der Scope verlassen wird. Du kannst sie gar nicht selbst zerstören. Das gleiche gilt allerdings auch für m1.



  • bakkuu schrieb:

    manni66 schrieb:

    bakkuu schrieb:

    Heisst das dann swap erzeugt eine Deep Copy?

    Da es nichts kopiert sicher nicht.

    Wie kann dann m1 weiterhin valide sein, wenn nichts kopiert wird und m2 zerstoert wird?? 😕

    Die Zeiger auf den Speicherbereich werden einfach geswappt.



  • tntnet schrieb:

    Du hast allerdings nicht gesagt, welchen Typ m1 und m2 haben und wie die swap-Methode von m1 implementiert ist.

    Ähh ... doch?

    bakkuu schrieb:

    Wenn ich 2 maps habe und die 2 swappe

    m1.swap(m2);
    

    tntnet schrieb:

    Es stellt sich allerdings die Frage, wie Du m2 zerstörst.

    Ähh ... nein? Warum sollte es relevant sein, wie m2 zerstört wird?



  • Belli schrieb:

    tntnet schrieb:

    Du hast allerdings nicht gesagt, welchen Typ m1 und m2 haben und wie die swap-Methode von m1 implementiert ist.

    Ähh ... doch?

    bakkuu schrieb:

    Wenn ich 2 maps habe und die 2 swappe

    m1.swap(m2);
    

    tntnet schrieb:

    Es stellt sich allerdings die Frage, wie Du m2 zerstörst.

    Ähh ... nein? Warum sollte es relevant sein, wie m2 zerstört wird?

    Ja richtig. Den Hinweis auf die map habe ich übersehen.

    Es ist eigentlich nicht relevant, wie m2 zerstört wird. Ich habe nur befürchtet, dass hier Zeiger auf Objekte vor liegen, bei dem die Objekte explizit zerstört werden. Wenn man normal RAII und so verwendet, stellt sich die Frage meines Erachtens gar nicht. Objekte in C++ verhalten sich halt wie skalare (int, long, double ...). In anderen Sprachen gibt es eine Referenzsemantik. Da stellt sich die Frage eher.


Anmelden zum Antworten