簡體   English   中英

使用Visual Studio和代碼塊時以C ++返回引用

[英]Return reference in c++ when use Visual Studio and Codeblocks

我正在學習C ++。 我同時使用Visual Studio 2015和代碼塊IDE來編碼C ++。 我嘗試編寫一個從函數返回引用變量的程序,盡管我運行相同的代碼,但從2個IDE(Visual Studio 2015和代碼塊)中得到了不同的結果(兩個結果)。 我嘗試編寫以下代碼:

#include <iostream>
using namespace std;
class Demo
{
public:
  int a;
};
//I wrote a function that returns a reference variable
Demo& func()
{
   Demo temp;
   temp.a = 1;
   return temp;
}
int main() 
{
  Demo& d = func(); //it error if I run this code on Codeblocks and it run 
                   //smoothly if I run it on Visual Studio 2015
  cout<<d.a;
  return 0;
}

我知道這取決於編譯器,但我想知道在這種情況下哪個正確? 預先感謝!

首先請注意,決定程序行為的是編譯器,而不是IDE(用於編寫代碼的程序)。 其他因素是磁盤上當前所存儲的內容以及您作為輸入獲得的內容(例如,來自用戶,網絡),系統時鍾等。

現在,正如@DeiDei正確指出的那樣,您會得到不同的行為,因為func()函數返回對該變量本地的變量的引用,並在執行結束時超出范圍。 它在堆棧上的內存(或與之關聯的寄存器)可能會被其他數據占用-並且您無法保證訪問它時會發生什么。 這是運行時具有未定義行為的可編譯代碼示例。

最后,大多數編譯器都會對此發出警告-我確信這對於您的IDE所使用的兩種編譯器都是正確的。 因此,您應該:

  1. 打開編譯器警告標志。
  2. 閱讀警告並加以解決。

您正在執行的操作是未定義的行為,因為您返回的引用是在函數超出范圍時銷毀的。 在VS2015中有效的事實只是偶然。

如果要返回本地創建的對象,則可以按值返回它,也可以使用shared_ptrunique_ptr動態分配它並將其作為指針返回。

真的很簡單。 當函數func到達最后一行時, temp的生存時間消失。 每當您嘗試訪問該值時,都會發生segmentation fault ,告訴您您正在嘗試訪問非法的內存位置。

除了運氣,我真的無法解釋您在Visual Studio中成功的原因。

暫無
暫無

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

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