簡體   English   中英

C ++函數返回引用

[英]C++ function return reference

這是另一個n00b問題:

為什么我不能/不應該將referece返回到函數的局部變量? 是因為臨時變量在函數執行完畢后會自動銷毀嗎?

const string & wrap(string & s1, const string & s2){
    string temp;
    temp = s2 + s1 + s2;
    return temp;
}

這個如何:

const string & wrap2(const string & s1, const string & s2){
    return (s2 + s1 + s2);  
}

函數內部聲明的變量在堆棧上分配。 當函數返回到調用者時,堆棧中用於駐留的變量的空間被回收並且不再可用,並且那里的變量不再存在(他們確實做了但你不能使用它們,它們可以是隨時覆蓋)。 所以,是的,基本上你說的。

就是這樣。 局部變量變為poof並在超出范圍時被銷毀。 如果您返回一個引用或指針,那么該引用或指針將指向垃圾,因為該對象將不再存在。

“這個如何: ...”

s2 + s1 + s2本身就是一個臨時局部變量,所以它也不能通過引用返回。

你可以做什么 - 但請不要,這是內存泄漏! - 是

const string & wrap2(const string & s1, const string & s2){
  string *pt = new string(s2+s1+s2);
  return *pt;
}

這將創建一個全局有效的字符串,然后可以通過引用傳遞,因為它在函數完成執行后不會被銷毀。 事實上,只要程序運行,它就永遠不會被破壞並占據空間:你可能不希望這樣!

但是,如果它不是const引用,則可以手動delete它。

編輯:所以事實證明你甚至可以刪除const引用,但再次 - 這不是很好。

就像之前的海報所說的那樣,這是因為局部變量最終會出現在堆棧上。 當你的指針仍懸掛在同一位置(現在已經改變)時,物理內存可能最終被賦予另一個功能框並被更改。 我不確定,但我不認為是“被破壞”,但它肯定不會被任何未來的堆棧分配所保護。

暫無
暫無

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

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