#include <iostream> using namespace std; // foo()函數本質上沒什麼問題,但建議你不要這樣寫代碼 string &foo() { string* str = new string("abc"); return *str; } /*返回地址,不要返回指針 指針是局部變量,存儲在棧上,函數結束後會被釋放 可是指針所指的內存空間不會被釋放掉,存在堆上,只有手動回收,或者在程序完全退出時回收 */ //引用其實是變量的別名,是指針類型。樓主的代碼在編譯器看來,引用換成了指針,實際上foo應該是這樣: string* foo_ptr() { string* str = new string("abc"); return str; } int main() { string & s1 = foo(); cout << "s1:" << s1 << endl; delete &s1; //拋開什麼編程規範,到這裏都沒有任何毛病, //string s2 = foo(); //這樣用foo()就一定會致使內存泄露 // foo_ptr string* str_ptr=foo_ptr(); delete str_ptr; return 0; }