我使用unique_ptr
管理一些资源,以便在任何情况下安全销毁等等。
void do_something(BLOB* b);
unique_ptr<BLOB> b(new_BLOB(20));
&*
比得到的更糟糕吗? e.g。
do_something(&*b);
或
do_someting(b.get());
两者似乎都有效。
答案 0 :(得分:13)
如果unique_ptr
没有内存,则operator*
的std::unique_ptr
具有未定义的行为,get()
将返回nullptr
。
如果unique_ptr
可能为空,我建议使用get()
,否则没有区别。
答案 1 :(得分:9)
&*b
不一定等同于b.get()
。为了确保收到指向托管对象的指针,您需要使用get()
。
有两个原因:
operator*
上调用unique_ptr
不管理任何对象是未定义的行为T
类型的托管对象可能会重载operator&
,因此您可能无法收到指向T
的有效指针。该标准定义了operator*
的{{1}}的优势:
std::unique_ptr
需要:
typename add_lvalue_reference<T>::type operator*() const;
- 醇>
返回:
get() != nullptr
因此,如果*get()
返回operator*
,则不允许应用&*
(来自get()
)。
如果存在,您将获得托管对象中任何重载nullptr
的返回值。这可以通过使用operator&
来规避,但未定义的行为问题仍然存在。
std::addressof
将为您提供托管对象的地址或std::unique_ptr<T>::get()
。使用nullptr
更安全,并且您有可预测的结果。
答案 2 :(得分:3)
正如其他答案所指出的,如果unique_ptr
没有管理任何对象,使用&*
会导致未定义的行为。
对于unique_ptr
管理指针的情况,在大多数情况下,
do_something(&*b);
相当于
do_someting(b.get());
唯一可以获得不同结果的是BLOB
有operator&
重载,返回的指针与对象的地址不同。
答案 3 :(得分:1)
这实际上是一个基于意见的问题。
我碰巧认为&*ptr
看起来很难看,而且读者不清楚为什么会这样写。但它确实具有与智能指针和常规指针一起使用的优势。