[英]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
中。 因此,如果您返回一個int
或std::string
根本沒有問題,但是如果您返回一個指向將在函數結束時釋放的內存的指針,哎呀。:您的指針將指向無效內存。 例如考慮這個:
const char* some_function() {
std::string res( ... );
//...
return res.c_str();
}
您正在返回指向將在函數返回后立即釋放的數據的指針(因為res
將被銷毀並且它將釋放其內部數據)因此您將獲得地址,但該地址並不指向您可能期望的地址!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.