1. 程式人生 > >返回一個臨時變數的右值引用,那麼臨時物件什麼時候釋放?

返回一個臨時變數的右值引用,那麼臨時物件什麼時候釋放?

最近在研究右值引用的時候碰到這個問題,還沒有解決,將問題貼在這裡,待更新:

const int* printAddress(const int & v)
{
    cout << v << endl;
    cout << reinterpret_cast<const void*>(&v) << endl;
    return (&v);
}
int getInt(int x)
{
    printAddress(x);
    return x;
}
int &&getRvalueInt(int x)
{

    printAddress(x);
    return std::move(x);
}
const int &getLvalueInt(int x)
{
    printAddress(x);
    return x;
}



int main()
{
    int *x = new int;
    *x = 11;
    int &&temp = getRvalueInt(*x);
    cout << endl;

    temp++;
    cout << temp << endl;
    cout << temp << endl;
    cout << endl;
    printAddress(temp);
}


註釋掉main函式中的一行,在執行觀察結果:

int main()
{
    int *x = new int;
    *x = 11;
    int &&temp = getRvalueInt(*x);
    //cout << endl;

    cout << temp << endl;
    cout << temp << endl;
    cout << endl;
    printAddress(temp);
}

然後發現輸出的結果是temp是11,並且temp的地址是函式中臨時變數的地址,問題在於緊接著再輸出一次發現temp的值變了,大概是變成了隨機數,意味著臨時變數的值釋放了,那麼使用使用右值引用指向的臨時變數的記憶體什麼時候釋放呢?

任何時候你都應該寫返回顯式右值引用的函式嗎?任何時候返回一個右值引用是什麼意思?函式返回的物件不已經是右值了嗎?

答案是,很多情況下不用(probably not)。大多數情況下,它有點像懸掛引用(引用存在,但是臨時物件要被析構)。返回左值引用非常危險,可能物件出了作用域就不再存在了。右值引用不能保持一個物件一直存活著。

相關推薦

返回一個臨時變數引用,那麼臨時物件什麼時候釋放?

最近在研究右值引用的時候碰到這個問題,還沒有解決,將問題貼在這裡,待更新: const int* printAddress(const int & v) { cout << v << endl; cout <<

c++ const 成員函式 & 臨時變數 & 引用 & move

const 成員函式 我們知道,在C++中,若一個變數宣告為const型別,則試圖修改該變數的值的操作都被視編譯錯誤。例如: const char blank = 'a'; blank = 'b'; // 錯誤 面向物件程式設計中,為了體

C++引用臨時變數引用引數和const引用和左引用

如果實參與引用引數不匹配,C++將生成臨時變數。如果引用引數是const,則編譯器在下面兩種情況下生成臨時變數:          實參型別是正確的,但不是左值          實參型別不正確,但可以轉換為正確的型別 Double refcube(const

C++的雜七雜八:我家的返回才不可能這麼傲嬌(引用和移動語義)

大凡程式語言,都會有“函式”這個概念。而對於外部而言,一個函式最重要的部分就是它的返回值了。 說這裡,返回值其實應該是一個很簡單的話題。當需要通過函式傳遞一個值出去的時候,使用返回值不是理所當然的嘛,比如說,像下面這樣: int add(int a, int b)

C++11移動語義探討——從臨時物件引用

一.前言 這篇文章主要談談c++11中引入的右值引用概念和移動語義概念。以及這些東西可能在我們程式設計中帶來哪些體驗、便捷或者是程式碼效率的提高。 文章主要分為以下三點: 臨時物件的產生 何謂右值引用 何謂移動語義 二.臨時物件的產生 在我們以

關於C++11引用一個誤解

關於右值引用的一個誤解 C++11引入了右值引用,但是如果不深入瞭解而望文生義的使用,會造成一些誤解。在處理函式返回的時候會有這種典型錯誤。 一個錯誤使用的例子 函式 foo()返回物件X,有的親可能想返回右值引用。 X foo () {

返回引用的傳遞問題

  最近突然發現了這個問題,挺有意思的,記錄下來備忘。   以下程式碼在gcc 4.8.1下編譯測試。 測試類   測試類結構如下: class Test2 { public: Test2() {} Test2(const char* str); Test2(co

一段小程式碼秒懂C++引用和RVO(返回優化)的誤區

關於C++右值引用的[參考文件](https://en.cppreference.com/w/cpp/language/reference)裡面有明確提到,右值引用可以延長臨時變數的週期。如: ```C std::string&& r3 = s1 + s1; // okay: rvalue r

C++11的引用

右值引用 語法 factor htm 類型 har start 移動 hand 右值引用是C++11 引入的新特性。它解決了兩類問題:實現移動語義和完美轉發。本文大絕大部分內容,來自於文章:http://kuring.me/post/cpp

C++ 引用與移動操作

銷毀 帶來 臨時對象 類型 左值引用 都是 獲得 留下 c++11 右值引用和移動操作是C++11提出的新概念,通過這些操作,可以降低拷貝操作帶來的消耗。先來簡單介紹一下左值和右值。 左值一般指的是一個對象,或者說是一個持久的值,例如賦值的返回值、下標操作、解引用以及前置遞

第15課 引用(2)_std::move和移動語義

可見 div 強制轉換 let 技術分享 移動語義 ptr align 講解 1. std::move (1)std::move的原型 template<typename T> typename remove_reference<T>::type&

引用引用

開發 左值 優化 語法 表達 3.2 右值 實現 規則 1、左值和右值的概念 左值是可以放在賦值號左邊可以被賦值的值;左值必須要在內存中有實體; 右值當在賦值號右邊取出值賦給其他變量的值;右值可以在內存也可以在CPU寄存器。

C++左引用引用

分配內存 右值 markdown type 提高 指向 區分 基本語法 down 1.左值和右值概念: 左值是可以放在賦值號左邊可以被賦值的值:左值就是指在表達式使用完之後仍存在的對象(存儲空間); 右值當在賦值號右邊去除值賦給其他變量的值:右值可以在內存也可以在CPU寄存

從4行代碼看引用

ESS 重載函數 內存 auto 復制代碼 默認 ins lba var 看到的文章,覺得很不錯,保留一下,不知是不是原文的地址:https://www.cnblogs.com/qicosmos/p/4283455.html 從4行代碼看右值引用 概述   右值引用的概

c++引用以及使用

什麽 函數的參數 .html 顯式 pan 但是 cout 表達式 信息 前幾天看了一篇文章《4行代碼看看右值引用》 覺得寫得不錯,但是覺得右值引用的內容還有很多可以去挖掘學習,所以總結了一下,希望能對右值引用有一個更加深層次的認識 一、幾個基本概念 1.1左值和右值 左值

[轉載][C++]C++11 左引用詳解

找到 延長 引用 () 字面量 別名 賦值 例子 左值 我之前以為左值就是等號左邊的值,右值就是等號右邊的值。 我 太天真 ?_? 原文地址:https://blog.csdn.net/hyman_yx/article/details/52044632 (侵刪 ------

C++11之引用與移動構造

添加 oooo 返回對象 oat 值引用 apc 定義 tco pri ----------------------------右值引用--------------------------------- 右值定義:   通俗來講,賦值號左邊的就是左值,賦值號右邊的就

c++ 引用,move關鍵字

賦值函數 .cpp 一次 -s 編譯器 一份 簡單 som this c++ move關鍵字 move的由來:在 c++11 以前存在一個有趣的現象:T& 指向 lvalue (左傳引用), const T& 既可以指向 lvalue 也可以指向 rval

c++11:物件移動 & 引用 & 移動建構函式

一、概述 c++ 11 新標準中最主要的特徵是可以移動而非拷貝物件的能力。很多情況下,物件拷貝後就會立即被銷燬。 在這些情況下,移動而非拷貝物件會大幅度提升效能。 在舊 C++ 標準中,沒有直接的方法移動物件。因此,即使不必要拷貝物件的情況下,我們也不得不拷貝。如果物件本身要求

【轉載】c++引用以及使用

轉自:https://www.cnblogs.com/likaiming/p/9045642.html 前幾天看了一篇文章《4行程式碼看看右值引用》 覺得寫得不錯,但是覺得右值引用的內容還有很多可以去挖掘學習,所以總結了一下,希望能對右值引用有一個更加深層次的認識 一、幾個基本概念 1.