首页 > 解决方案 > 本例中的“别名本地 shared_ptr”是什么

问题描述

我对 Cpp 核心指南中的一个示例有疑问。在R.37 中:不要传递从别名智能指针获得的指针或引用,有以下示例:

// global (static or heap), or aliased local ...
shared_ptr<widget> g_p = ...;

void f(widget& w)
{
    g();
    use(w);  // A
}

void g()
{
    g_p = ...; // oops, if this was the last shared_ptr to that widget, destroys the widget
}

而且我不明白第一条评论中的“本地别名”是什么意思。它是否连接到别名指针类型,如

using WidgetPtr = std::shared_ptr<widget>;

还是我完全走错了路?我想我理解这个全局 shared_ptr 的例子,但不是别名本地的。

标签: c++aliassmart-pointerscpp-core-guidelines

解决方案


std::shared_ptrstd::shared_ptr当指向对象的所有对象都被销毁或重新分配给其他对象时,将自动销毁它指向的对象。

这意味着如果您存储一个指针或对由 a 管理的对象的引用std::shared_ptr(这是一个别名指针),如果std::shared_ptr管理它被破坏或修改,它可能会突然变得悬空。

您遗漏了示例中最重要的部分,但在这种情况下:

std::shared_ptr<int> shared = std::make_shared<int>(7);
int& ptr = *shared;
shared = nullptr;

shared设置为nullptr时,它指向的对象立即被销毁,这意味着指向它的任何指针(如ptr)现在都悬空,并且对其进行读取或写入将导致 UB。


推荐阅读