1.问题说明
返回一个临时对象的引用是不安全的,因为当离开作用域,这个临时对象会马上析构,所以函数返回的总是悬挂引用(空悬引用),使用这个引用是一个未定义行为,会导致程序崩溃。
2.问题分析
看下面这段代码:
const int&retRef()
{
return 1180;
}
const int&k = retRef();
std::cout<<k<<std::endl;
此时打印k,就是一个未定义行为,因为,1180的引用所指对象已经被销毁了(引用其实只是常量指针)。
这个很容易识别。但是,这里实际上隐含一个只能指针的坑。
下面这段代码其实也是不安全的:
const std::shared_ptr<int>& retRef()
{
return nullptr;
}
智能指针也是一个对象,返回nullptr,编译器会构造一个临时对象,并用拷贝构造函数吧null复制进去,此时,会产生和上面那段代码一样的问题。
如果此时,调用这个函数,其实也是未定义行为。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。