![](/img/trans.png)
[英]No such directory or file in C++ [Codeblocks/Visual Studio]
[英]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所使用的兩種編譯器都是正確的。 因此,您應該:
您正在執行的操作是未定義的行為,因為您返回的引用是在函數超出范圍時銷毀的。 在VS2015中有效的事實只是偶然。
如果要返回本地創建的對象,則可以按值返回它,也可以使用shared_ptr
或unique_ptr
動態分配它並將其作為指針返回。
真的很簡單。 當函數func
到達最后一行時, temp
的生存時間消失。 每當您嘗試訪問該值時,都會發生segmentation fault
,告訴您您正在嘗試訪問非法的內存位置。
除了運氣,我真的無法解釋您在Visual Studio中成功的原因。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.