2017-01-06 6 views
4
// move constructor 
    ArrayWrapper (ArrayWrapper&& other) 
     : _p_vals(other._p_vals ) 
     , _size(other._size) 
    { 
     other._p_vals = NULL; 
     other._size = 0; 
    } 

Ich fand ein Tutorial auf Rvalue Referenzen. Ich verstehe wirklich nicht, warum wir other._p_vals = NULL; und other._size = 0; Der Autor erklärt gesetzt haben:rvalue Referenzen in C++

Aber warum brauchen wir other._p_vals = NULL setzen? Der Grund ist derDestruktor - wenn das temporäre Objekt außerhalb des Gültigkeitsbereichs verschwindet, wie alle anderen C++ - Objekte, wird sein Destruktor ausgeführt.

Wenn es außerhalb des Gültigkeitsbereichs geht und zerstört wird, warum other._p_vals = NULL Einstellung plagen

Wenn seine destructor läuft, es _p_vals befreien. Die gleichen _p_vals, die wir gerade kopiert haben!

Ich dachte, wir bewegten nicht kopiert, oder ... liege ich falsch?

Wenn wir other._p_vals auf NULL gesetzt nicht , würde die Bewegung nicht wirklich eine Schachzug sein - es wäre nur eine Kopie sein, die später zu einem Absturz führt, sobald wir mit freigegebenen Speicher starten . Dies ist der springende Punkt einer Verschiebung Konstruktor: Um eine Kopie zu vermeiden, indem Sie das ursprüngliche, temporäre Objekt ändern!

Kann mir jemand helfen zu verstehen?!?

+0

Der Destruktor würde Code haben, der etwas mit '_p_vals' tut (z. B.' lösche's). Wenn du diese Zeilen nicht hast, kopierst du und bewegst dich nicht. –

Antwort

4

Da diese Klasse einen Rohzeiger enthält, können wir nur annehmen, dass es sie besitzt, und deshalb muss sein destructor in etwa so aussehen:

ArrayWrapper::~ArrayWrapper() { 
    delete[] _p_vals; 
} 

In diesem Schritt Konstruktor wir die Interna von other sind „stehlen“. Wenn wir die Interna von other nicht ausradieren (wobei wir darauf achten, es in einem konsistenten "leeren" Zustand zu lassen, also auch _size = 0), dann wird, wenn eines der other oder das neue Objekt zerstört wird, das verbleibende übrig sein bei einigen Daten, die jetzt gelöscht wurden.

Sharing Interna ist ein ganz anderes Muster zu stehlen jemandes Interna.

+0

Aber ist nicht ein anderes temporäres Objekt, das sowieso zerstört wird? – Samu

+2

Nicht unbedingt, aber nehmen wir an, dass es so ist. Dann wird "Other" zerstört, und in seinem Destruktor (vorausgesetzt, es ist richtig geschrieben), "löschen" seine '_p_vals'. Dann zeigt das neue Objekt auf Müll. – BoBTFish

+0

Danke, es macht jetzt Sinn! – Samu