std::unique_ptr::get首先是否违背了使用惟一 _ ptr 的目的? 我希望这个函数能够改变它的状态,这样它就不再保存指针了。 Std: : only _ ptr: : get 是否有实际有用的用法?
std::unique_ptr::get
当您需要调用一个 C API,或者一个设计糟糕的 C + + API 时,这种情况是显而易见的。
每次需要将原始指针传递给(比如说)一个 C 函数时,都会使用它:
std::unique_ptr<char[]> buffer( new char[1024] ); // ... fill the buffer int rc = ::write( fd, buffer.get(), len );
当你的手被绑住,你确实需要传递一个指针到什么东西,p.get()读取优于 &*p。
p.get()
&*p
有一个函数可以改变状态,这样 unique_ptr就不再保存指针了,这个函数叫做 release。这对于将所有权转移到不提供 unique_ptr直接构造的其他智能指针非常有用。任何其他使用都有泄漏资源的风险。
unique_ptr
release
我倾向于遵循的规则是这样的: 如果被调用方没有搞砸生存期/所有权,不要给它传递智能指针; 而是传递一个原始的 C + + 引用(首选)或原始指针。我发现将所有权和使用权分离出来更加干净和灵活。
std::unique_ptr安全地提供唯一的所有权语义。然而,这并不排除需要 非拥有指针。std::shared_ptr有一个非拥有的对应物 std::weak_ptr。原始指针作为 std::unique_ptr的非拥有对应物运行。
std::unique_ptr
std::shared_ptr
std::weak_ptr
Herb Sutter 有个很好的解释(大约3:40) Https://www.youtube.com/watch?v=jfmtagwcqoe
主要的优点是,唯一的指针跟踪有多少其他引用到该指针。只有在处理所有权时才使用唯一指针。当您希望使用该指针对数据执行某些操作时,需要传递原始指针。