我讀這篇文章:What are move semantics?移動語義如何保留臨時變量的數據?
注意,在該職位轉移構造函數給出的例子是:
string(string&& that)
{
data = that.data;
that.data = nullptr;
}
我感到十分困惑,當我們使用string a(x+y)
構造一個新的字符串。由於x+y
的結果是一個臨時變量,它很快就會被銷燬。這意味着複製指針(data = that.data
)確實會在原始數據(應該存儲在函數調用完成後清理的棧幀x+y
)被銷燬之後,通過懸掛指針進行復制。看來設置that.data
爲nullptr將無濟於事,因爲無論如何堆棧幀都會被清理乾淨。
任何人都可以解釋爲什麼這不是一個問題?那麼C++如何處理這種情況呢?
移動對象通常改變靶和源對象(目標竊取數據和離開什麼也沒有的源 - 說不定數據的交換) –
'X + y'創建保存一個指針'data'對存儲器的臨時字符串在包含相關數據的堆上。如果臨時超出範圍,它在堆上擁有的內存將被刪除。但此舉構造你引述改變了一種方式,它不擁有該內存了臨時 - 所以它會走出去的範圍,而不實際接觸的內容。相反,新創建了''現在擁有該內存(其'data'點的數據,最初是由'X + y'擁有)。 – Pixelchemist