68

首先不会std::unique_ptr::get破坏拥有 unique_ptr 的目的吗?我本来希望这个函数改变它的状态,所以它不再持有指针。std::unique_ptr::get 有实际有用的用途吗?

4

6 回答 6

93

std::unique_ptr安全地提供独特的所有权语义。然而,这并不排除对非拥有指针的需要。std::shared_ptr有一个非拥有的对应物,std::weak_ptr. 原始指针作为std::unique_ptr' 的非拥有对应物运行。

于 2012-05-29T17:23:28.697 回答
83

每次需要将原始指针传递给 C 函数时都使用它:

std::unique_ptr<char[]> buffer( new char[1024] );
// ... fill the buffer
int rc = ::write( fd, buffer.get(), len );
于 2012-05-29T15:24:02.897 回答
35

我倾向于遵循的规则是:如果被调用者没有使用生命周期/所有权,请不要向它传递智能指针;而是传入原始 C++ 引用(首选)或原始指针。我发现将所有权的关注与使用的关注区分开来更清晰、更灵活。

于 2012-05-29T16:47:45.280 回答
22

当你的双手被束缚并且你确实需要传递一个指向某物的指针时,p.get()读起来比&*p.

有一个函数可以更改状态,因此unique_ptr不再保存指针,并且该函数被命名为release. 这对于将所有权转移到其他不提供从unique_ptr. 任何其他使用都有泄漏资源的风险。

于 2012-05-29T15:24:39.420 回答
-1

当您需要调用 C API 或设计不佳的 C++ API 时,就会出现明显的情况。

于 2012-05-29T15:23:04.720 回答
-2

Herb Sutter 有一个很好的解释(大约 3:40) https://www.youtube.com/watch?v=JfmTagWcqoE

主要优点是唯一指针跟踪该指针有多少其他引用。仅在使用所有权时才使用唯一指针。当你想用那个指针对数据做一些事情时,你传递原始指针。

于 2017-08-02T20:06:32.537 回答