簡體   English   中英

C++ 返回臨時對象混亂

[英]C++ returning temporary objects confusion

我有一個相當基本的 C++ 問題:考慮一個接受一些輸入參數並從這些參數創建一個std::string的函數,如下所示:

std::string constructString( int some_parameter ) {
    
    std::stringstream ss;
    
    // Construct a string (arbitrarily complex)
    ss << "Some parameter is " << some_parameter << " right now";

    return ss.str();    //Am I not returning a temporary object here?
}

我知道當函數返回時stringstream對象將超出范圍,但這不會使構造的字符串也無效嗎?

如果我將返回類型更改為const char *並改為返回ss.str().c_str()會發生什么情況?

上面的代碼似乎可以工作,但我懷疑這只是因為包含“臨時”對象的內存在我使用它時還沒有被其他東西覆蓋?

我不得不承認,一般來說,我在這種情況下很困惑; 如果有人能向我解釋這整個“臨時對象”的事情(或者只是指出正確的方向),我將不勝感激。

您正在返回一個臨時對象,但是因為您按值返回它,所以創建了副本。 如果您返回臨時對象的指針或引用,那將是一個錯誤。

如果將返回類型更改為const char *並返回ss.str().c_str() ,您將返回指向ss.str()返回的臨時std::string的某個緩沖區的指針,這將很糟糕。

如您所見 ,Stringstream::str()返回std::string對象。 您返回沒有引用的std::string ,這意味着沒有 RVO(NRVO) 優化復制構造函數將調用並創建有效的std::string對象。 通過優化std::string將在沒有復制構造函數的情況下移動。 但是如果將返回std::string&它將崩潰,因為該對象將在函數返回后被銷毀。 const char *也會產生同樣的效果,因為銷毀此指針后將指向壞內存,這是危險的情況。

假設: T val = some_function() ,當您從some_function返回一個值時,C++ 使用指定的復制構造函數或內置運算符將返回值的值復制到val中。 因此,如果您返回一個intstd::string根本沒有問題,但是如果您返回一個指向將在函數結束時釋放的內存的指針,哎呀。:您的指針將指向無效內存。 例如考慮這個:

const char* some_function() {
    std::string res( ... );
    //...
    return res.c_str();
}

您正在返回指向將在函數返回后立即釋放的數據的指針(因為res將被銷毀並且它將釋放其內部數據)因此您將獲得地址,但該地址並不指向您可能期望的地址!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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