unique_ptr::get() 而不是 &* 是怎么回事?
What's with unique_ptr::get() instead of &*?
我使用unique_ptr
来管理一些资源,以便在各种情况下安全销毁,等等。
void do_something(BLOB* b);
unique_ptr<BLOB> b(new_BLOB(20));
&*
比get差得多吗?例如
do_something(&*b);
或
do_someting(b.get());
两者似乎都有效。
如果unique_ptr
没有内存,则std::unique_ptr
的operator*
具有未定义的行为,其中get()
将返回nullptr
。
如果unique_ptr
可能是空的,我建议使用get()
,否则没有区别。
&*b
不一定等同于b.get()
。为了确保接收到指向托管对象的指针,您需要使用get()
。有两个原因:
- 在不管理任何对象的
unique_ptr
上调用operator*
是未定义的行为 - 类型为
T
的托管对象可能会重载operator&
,因此您可能不会收到指向T
的有效指针
本标准定义了std::unique_ptr
:中operator*
的组合
typename add_lvalue_reference<T>::type operator*() const;
需要:
get() != nullptr
返回:
*get()
因此,如果get()
返回nullptr
,则不允许应用operator*
(来自&*
)。
您将获得托管对象中任何重载的operator&
的返回值(如果存在)。这可以通过使用std::addressof
来避免,但未定义的行为问题仍然存在。
std::unique_ptr<T>::get()
将为您提供托管对象的地址,如果没有托管对象,则为nullptr
。使用get()
更安全,并且可以得到可预测的结果。
正如其他答案所指出的,如果unique_ptr
不管理任何对象,则使用&*
会导致未定义的行为。
对于unique_ptr
管理指针的情况,在大多数情况下,
do_something(&*b);
相当于
do_someting(b.get());
如果BLOB
有一个operator&
重载,它返回的指针与对象的地址不同,那么唯一可以得到不同结果的情况就是。
这实际上是一个基于意见的问题。
我碰巧觉得&*ptr
看起来很难看,读者不清楚它为什么会这样写。但它的优点是可以与智能指针和常规指针配合使用。
- 使用递归的数组的最小值.这是怎么回事
- 我不小心调用了一个没有自己类对象的成员函数.但这是怎么回事呢
- 我使用 OpenMP 的线程越多,执行时间就越长,这是怎么回事?
- 绕道重铸瓷砖层是怎么回事
- 架 (U+67B6) 与en_US不符.UTF-8.这是怎么回事?
- R 中的算术在数字上比整数更快。这是怎么回事?
- 我的代码运行良好,但现在当尝试将其制作成模板时,我遇到了许多看似无关的错误。这是怎么回事?
- 在变量名后声明带有 () 的非内部类型与不使用变量名的行为不同。即 std::map<int,char>x(); - 这是怎么回事?
- 弄清楚这段代码是怎么回事(递归下降案例研究)
- 分配器密集和稀疏是怎么回事?
- 传递引用C++,指针的向量.这是怎么回事?
- __vector_base_common是怎么回事?
- (对象)不命名类型.怎么回事
- 变量已在 .obj 中定义;这是怎么回事?
- Sublime上的EasyClangComplete是怎么回事?
- 重复输出的类型是怎么回事,它如何区分迭代次数和 Ascii 代码?
- 标准::地图使用.这是怎么回事?核心转储?我做得不正确?
- llvm libcxx的源代码是怎么回事?
- 这一行是怎么回事: istringstream is( line );
- "enable_if"使编译器很难生成可读的错误消息,这是怎么回事