c++函数返回引用的陷阱

c++函数返回引用的陷阱

这几句代码貌似没有问题。实际上,在字面值字符串传入const string&的时候发生了隐式转换,生成了一个string的临时值。返回的是此临时值的引用。当代码执行到cout时,临时值已经被释放。所以name是一个未定义的值。

函数返回引用是个危险的操作。如果该引用指向函数的参数,会出现上述问题;如果指向局部变量,该引用必然是个无效的引用,因为函数返回时局部变量已经被释放;如果该引用指向堆内存的变量,则无法释放,除非你想让它与进程共存亡。在万不得已的情况下可以指向类成员变量,不过要考虑要在其对象释放之前使用。

不过函数返回引用还是有其用途的。第一,可以在拷贝赋值运算符中返回*this的引用,使得外界可以连续赋值,如a=b=c;第二,可以在单例模式下静态函数返回静态变量的引用。