使用 std::unique_ptr 有什么好处吗?

Seb*_*Bln 4 c++ exception unique-ptr

我偶然发现了这样的代码:

void foo(T* bar); // Note: takes ownership of 'bar'.

foo(new T());
Run Code Online (Sandbox Code Playgroud)

现在我想知道将其重构为是否有任何意义:

void foo(T* bar); // Note: takes ownership of 'bar'.

auto tempT = std::make_unique<T>();
foo(tempT.release());
Run Code Online (Sandbox Code Playgroud)
  • 它更安全吗?
  • 它确实使所有权转移更加清晰,尽管从参数列表中调用“new”本身就已经非常清楚了。

请注意,不幸的是我无法更改“foo”的签名。

eer*_*ika 7

它更安全吗?

不。但是,考虑一个稍微复杂的例子:

auto tempT = std::make_unique<T>();
some_operation();
foo(tempT.release());
Run Code Online (Sandbox Code Playgroud)

在这种情况下,如果不使用 unique_ptr,将会存在异常安全的潜在问题。

也就是说,更安全的是:

void foo(std::unique_ptr<T> bar);  // no need to note that takes ownership
                                   // because that's implied by the type
Run Code Online (Sandbox Code Playgroud)

请注意,不幸的是我无法更改“foo”的签名。

然后编写一个您可以控制的包装函数。

  • @SergeyA `这与 OP 的示例不同`正确。在这里重复 OP 示例是多余的,因为 OP 示例已经在问题中。确实,您正在创建指针和使用 foo 之间注入 some_operation 。这部分比原始示例稍微复杂一些。“OP 的替代方案是在调用 foo 时就地使用 new。”在更复杂的情况下,在分配和调用“foo”之间存在操作时,该替代方案不是一个选择。 (3认同)
  • @SergeyA 这篇文章首先回答了OP的问题。更人为的示例与此分开呈现。 (2认同)