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


Anmelden zum Antworten