c++ - 本例中的“别名本地 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 的例子,但不是别名本地的。
解决方案
std::shared_ptr
std::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。
推荐阅读
- java - 我是否需要自动化扫描 QR 的应用程序,是否有 Appium 功能可以从 JAVA 发送特定的 QR?
- vue.js - 修复了 vue js 中带有动态内容的侧边栏
- linux - Linux Find 命令——根据文件名排除查找
- javascript - 如何动态重新加载部分文档
- r - 如何根据 TOOL 列中的不同值在 ITEM 上使用多个分隔符?
- apache-nifi - 将json文件拆分为多个流文件
- excel - Excel 正在引用我的文件的另一个版本。我怎样才能让它引用自己呢?
- python - Numpy 的结构化数组与 xarray(xray)有什么区别?
- javascript - Chrome 扩展在特定选项卡上运行进程
- java - @Transactional Spring 链接和自调用