共计 409 个字符,预计需要花费 2 分钟才能阅读完成。
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 复制进去,此时,会产生和下面那段代码一样的问题。
如果此时,调用这个函数,其实也是未定义行为。
正文完