簡體   English   中英

C ++中的右值引用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM