[英]rvalue references in C++
// move constructor
ArrayWrapper (ArrayWrapper&& other)
: _p_vals( other._p_vals )
, _size( other._size )
{
other._p_vals = NULL;
other._size = 0;
}
我找到了關於右值引用的教程。 我真的不明白為什么我們要設置other._p_vals = NULL;
和other._size = 0;
作者解釋說:
但為什么我們需要設置other._p_vals = NULL? 原因是析構函數 - 當臨時對象超出范圍時,就像所有其他C ++對象一樣,它的析構函數將運行。
如果它超出范圍並被破壞,為什么還要設置other._p_vals = NULL
當析構函數運行時,它將釋放_p_vals。 我們剛剛復制的_p_vals相同!
我以為我們感動不復制,或者......我錯了嗎?
如果我們不將other._p_vals設置為NULL,那么移動實際上不會是一個移動 - 它只是一個副本,一旦我們開始使用釋放的內存就會引入崩潰。 這是移動構造函數的重點:通過更改原始的臨時對象來避免復制!
有人可以幫我理解嗎?!?
由於這個類包含一個原始指針,我們只能假設它擁有它,因此它的析構函數必須類似於:
ArrayWrapper::~ArrayWrapper() {
delete[] _p_vals;
}
在這個移動構造函數中,我們“偷”了other
的內部。 如果我們沒有刪除other
的內部(小心將它保持在一致的“空”狀態,所以也設置_size = 0
),那么當other
任何一個或新對象被銷毀時,剩下的那個將是指向一些現已刪除的數據。
共享內部是一種非常不同的方式來竊取其他人的內部。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.