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());

两者似乎都有效。

&*b 不一定等同于 b.get()。为了确保收到指向托管对象的指针,您要使用 get()。 有两个原因:

  • 在不管理任何对象的 unique_ptr 上调用 operator* 是未定义的行为
  • T 类型的托管对象可能会重载 operator&,因此您可能无法收到指向 T.
  • 的有效指针

标准定义了std::unique_ptroperator*的行为:

typename add_lvalue_reference<T>::type operator*() const;

  1. Requires: get() != nullptr

  2. Returns: *get()

因此,如果 get() returns nullptr.

,则不允许应用 operator*(来自 &*

您将获得托管对象中任何重载 operator& 的 return 值(如果存在)。这可以通过使用 std::addressof 来规避,但未定义的行为问题仍然存在。

std::unique_ptr<T>::get() 将为您提供托管对象的地址,如果没有托管对象,则为 nullptr。使用 get() 更安全,而且结果可预测。

正如其他答案所指出的,如果 unique_ptr 不管理任何对象,则使用 &* 会导致未定义的行为。

对于unique_ptr管理指针的情况,在大多数情况下,

do_something(&*b);

等同于

do_someting(b.get());

唯一可能得到不同结果的情况是 BLOB 有一个 operator& 重载,即 returns 一个不同于对象地址的指针。

这确实是一个基于意见的问题。

我碰巧认为 &*ptr 看起来很难看,reader 不清楚为什么要这样写。但它确实有一个优点,它可以与智能指针和常规指针一起使用。

operator* of std::unique_ptr has undefined behavior if no memory is owned by the unique_ptr where as get() 会 return nullptr.

如果 unique_ptr 可能为空我建议使用 get() 否则没有区别。