#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; ; }