此示例中的'aliased local shared_ptr'是什么
What is an 'aliased local shared_ptr' in this example
我有一个关于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
将自动销毁它指向的对象。
这意味着,如果存储指针或对由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。
const shared_ptr<widget>& alias = g_p;
是g_p
的别名。代码中没有别名的本地shared_ptr
,他们只是为了完整性而提到它:你不能通过创建指向全局变量的引用或指针来回避这个问题(或多或少只是在本地范围内给它一个不同的名称 - 别名(。
它与像您的WidgetPtr
这样的类型别名无关(尽管当然可以使用类型别名来创建全局shared_ptr
的本地别名,但这是正交的(。
换句话说:如果这是错误的代码:
void bad_code()
{
// BAD: passing pointer or reference obtained from a nonlocal smart pointer
// that could be inadvertently reset somewhere inside f or it callees
f(*g_p);
// BAD: same reason, just passing it as a "this" pointer
g_p->func();
}
那么这也是糟糕的代码:
void also_bad_code(bool maybe)
{
const auto& maybe_g_p_alias = maybe ? g_p : someOtherValue; // Potentially aliases g_p
f(*maybe_g_p_alias);
maybe_g_p_alias->func();
}
在这种情况下,"别名"的意思是"同一对象的另一个名称"。
f
将引用widget& w
作为参数。因此,如果您用f(g_p)
调用它,那么f
内部g_p
和w
都引用同一个对象g_p
。w
是g_p
的别名。指南说你不应该调用f(g_p)
(g_p是一个全局对象(,也不应该调用f(w)
(w 是全局对象的别名本地/本地别名(。
- CLANG 编译器 说:变量"PTR"可能未初始化
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 将 ptr 传递给 ptr 到 A 作为参数传递给 A 的函数是不好的做法吗?
- 为共享 ptr 向量实现复制 c'tor?
- 字符和整数中 **(ptr+1) 的值差异
- C++:在不中断共享的情况下通过引用传递共享 PTR?
- 如何将派生类从基 ptr 分配给 nlohmann::json
- 引用 std::shared:ptr 以避免引用计数
- 为什么我不能在不进行任何转换的情况下将浮点数放入任何类型的 ptr 中?
- 在调用函数时,ptr** 和 ptr*& 之间是否有区别,或者首选C++?
- 另一种类型的智能ptr,比如具有弱refs的unique_ptr
- 尝试打印出 *ptr++ 的值,以了解它是如何工作的
- 如何控制共享 ptr 引用计数?
- dopen():不以 root 身份运行时"failed to map segment from shared object"
- C++中的指针否定 (!ptr == NULL)
- 从const ptr*转换为ptr*时出现问题
- 无法使用 libtool 将 -shared 参数传递给 g++
- boost::shared_ptr和std::shared-ptr的同居
- 我可以用std::shared_ptr而不是boost::shared-ptr构建boost库吗
- shared-ptr-C++shared_ptr与unique_ptr用于资源管理