move semantik richtig verstanden?(folgende 5 Codezeilen blödsinn?)
-
Hi, ich hab movesemantik nun so verstanden, dass
bar b; bar b2(move(b)); b.foo(); b2.bar();auf jeden Fall Blödsinn ist(auch wenn es kompiliert, könnten sich pointer teilen oder auch nicht), hab ich das richtig verstanden?
-
Um das zu beurteilen, müsste man schon ein aussagekräftiges Beispiel mit sinnvollen Bezeichnern haben. Was hast du vor?
-
Wenn die Objekte sich pointer teilen würden, würden sie ja doppelt gelöscht, also müssten alle pointer von b auf NULL gesetzt werden.
-
Hi yeanno,
in Zeile 2 bewirkt das std::move, dass der Move-Konstruktor statt des Copy-Kontruktors aufgerufen werden kann.
In der Regel erlaubt die Übergabe einer rvalue-Referenz (somit hier der Parameter des Move-Konstruktors), dass dieses Objekt (inhaltlich) zerstört werden darf. Es muss lediglich der Destruktor dieses Objektes noch aufrufbar sein. Somit ist in Zeile 3 der Aufruf einer Funktion auf einem 'zerstörten' Objekt.
Wenn ich von zerstört rede, werden z. B. irgendwelche Zeiger in dem Objekt nach der Zeile 2 NULL sein. Die 4. Zeile wäre wieder problemlos möglich.
-
In der Regel erlaubt die Übergabe einer rvalue-Referenz (somit hier der Parameter des Move-Konstruktors), dass dieses Objekt (inhaltlich) zerstört werden darf. Es muss lediglich der Destruktor dieses Objektes noch aufrufbar sein. Somit ist in Zeile 3 der Aufruf einer Funktion auf einem 'zerstörten' Objekt.
Wenn ich von zerstört rede, werden z. B. irgendwelche Zeiger in dem Objekt nach der Zeile 2 NULL sein.darum gings mir, danke.
-
Gern geschehen...
als kleines Beispiel noch:
#include <iostream> class bar{ public: bar(int val) : i(new int(val)){} bar(const bar& b) : i(new int(*b.i)) {} // Copy-Constructor bar(bar&& b) : i(b.i) { b.i=0; } // Move-Constructor ~bar() { delete i; } // delete 0 ist erlaubt void print(){ if(!i) std::cout << "object internally destroyed -> crash" << std::endl; std::cout << *i << std::endl; } private: int* i; }; int main() { bar b1(2); bar b2(b1); b1.print(); b2.print(); bar b3(std::move(b1)); b3.print(); b1.print(); // ui... }2
2
2
object internally destroyed -> crash
Segmentation fault