std::unique_ptr::get 的意义何在

what's the point of std::unique_ptr::get

本文关键字:get unique ptr std      更新时间:2023-10-16
std::unique_ptr::get首先不是

违背了拥有unique_ptr的目的吗?我本来希望这个函数会改变它的状态,所以它不再包含指针。std::unique_ptr:get是否有实际有用的用途?

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

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

std::unique_ptr<char[]> buffer( new char[1024] );
// ... fill the buffer
int rc = ::write( fd, buffer.get(), len );

我倾向于遵循的规则是这样的:如果被调用方没有为生存期/所有权而烦恼,请不要向它传递智能指针; 相反,传入原始C++引用(首选)或原始指针。 我发现将所有权与使用的关注分开要干净、更灵活。

当你的双手被绑住并且你确实需要传递指向某物的指针时,p.get()读起来比&*p更好。

有一个函数可以更改状态,因此unique_ptr不再持有指针,并且该函数名为 release 。这对于将所有权转移到其他不提供从unique_ptr直接构造的智能指针非常有用。任何其他使用都有泄漏资源的风险。

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

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

主要优点是唯一指针跟踪该指针的其他引用数量。只有在使用所有权时,才能使用唯一指针。当您想使用该指针对数据执行某些操作时,请传递原始指针。