1.
string Fun1()
{
string num="ly";
return num;
}
//在程式中使用此方法不會報錯,因為方法執行完畢以後雖然num被釋放,但是num的值會被儲存到一個臨時儲存單元,然後從臨時儲存單元複製到調用此方法給其賦值的變數中去(如:在main方法中:string mynum=Fun1(),num的值就會被儲存到mynum)
2.
string& Fun2()
{
string num="ly";
return num;
}
//在程式中使用此方法會報錯,因為返回的是對num的引用,而Fun2()方法執行完畢以後num被釋放了,所以返回的引用試圖引用已經被釋放的記憶體會報錯
後來研究發現,將以上兩個例子中的string類型換做int類型,都不會報錯。既:
#include <iostream>
#include <string>
using namespace std;
int& Fun1()
{
int num=123;
return num;
}
int main()
{
int mynum=Fun1();//運行到這一句居然不報錯,為什嗎?難道Fun1中的局部變數num沒有被釋放?
cout<<mynum<<endl;
return 0;
}
如果將int類型換為int指標類型,又會報錯:
#include <iostream>
#include <string>
using namespace std;
int*& Fun1()
{
int num=456;
int *p=#
return p;
}
int main()
{
int* p=Fun1();//運行到這一句居然不報錯,為什嗎?難道Fun1中的局部變數num沒有被釋放?
cout << "result:\n";//在對指標p取值之前,必須任意調用一個方法,以產生參數壓棧或局部變數申請記憶體操作,好覆蓋Fun1方法中的具備變數num
cout<<*p<<endl; //輸出一個錯誤的值
return 0;
}