返回智能指针解引用的引用类型是否会引发悬空引用?
问题解答
先看对应的C++代码:
const string& show_string(){ std::shared_ptr<std::string> p = std::make_shared<std::string>("test"); return *p; }
这段代码会导致悬空引用,核心原因如下:
- 函数内的
std::shared_ptr<std::string> p是局部变量,生命周期仅局限于show_string()函数执行期间。 - 函数执行结束时,局部
shared_ptr会被销毁,它所管理的std::string对象的引用计数会降至0,该字符串的内存会被自动释放。 - 函数返回的是
*p的引用,也就是指向已被释放的字符串对象的引用。调用者获取该引用后,它指向的是已经回收的无效内存,后续任何对该引用的访问都属于未定义行为。
总结:局部智能指针销毁时会释放其托管的对象,留下的引用自然成了悬空引用。
内容的提问来源于stack exchange,提问作者Eliane Zhu
相关产品推荐
相关产品推荐

