gpt4 book ai didi

c++ - unique_ptr 和 shared_ptr 的区别

转载 作者:IT老高 更新时间:2023-10-28 11:26:57 27 4
gpt4 key购买 nike

Possible Duplicates:
pimpl: shared_ptr or unique_ptr
smart pointers (boost) explained

有人能解释一下 shared_ptr 和 unique_ptr 之间的区别吗?

最佳答案

这两个类都是智能指针,这意味着它们会自动(在大多数情况下)在无法再引用该对象时释放它们指向的对象。两者的区别在于每种类型有多少个不同的指针可以引用一个资源。

当使用 unique_ptr 时,最多可以有一个 unique_ptr 指向任一资源。当 unique_ptr 被销毁时,资源会自动回收。因为任何资源只能有一个 unique_ptr,所以任何复制 unique_ptr 的尝试都会导致编译时错误。例如,这段代码是非法的:

unique_ptr<T> myPtr(new T);       // Okay
unique_ptr<T> myOtherPtr = myPtr; // Error: Can't copy unique_ptr

但是,unique_ptr 可以使用新的移动语义移动:

unique_ptr<T> myPtr(new T);                  // Okay
unique_ptr<T> myOtherPtr = std::move(myPtr); // Okay, resource now stored in myOtherPtr

同样,你可以这样做:

unique_ptr<T> MyFunction() {
unique_ptr<T> myPtr(/* ... */);

/* ... */

return myPtr;
}

这个习惯用法的意思是“我正在向您返回一个托管资源。如果您没有明确捕获返回值,那么该资源将被清理。如果您这样做了,那么您现在拥有该资源的独占所有权。 "这样,您可以将 unique_ptr 视为 auto_ptr 的更安全、更好的替代品。

另一方面,

shared_ptr 允许多个指针指向一个给定的资源。当资源的最后一个 shared_ptr 被销毁时,该资源将被释放。例如,这段代码是完全合法的:

shared_ptr<T> myPtr(new T);       // Okay
shared_ptr<T> myOtherPtr = myPtr; // Sure! Now have two pointers to the resource.

在内部,shared_ptr 使用 reference counting要跟踪有多少指针引用了一个资源,所以需要注意不要引入任何引用循环。

简而言之:

  1. 如果您想要一个指向对象的单个指针,该对象将在该单个指针被销毁时被回收,请使用 unique_ptr
  2. 当您需要多个指向同一资源的指针时,请使用 shared_ptr

希望这会有所帮助!

关于c++ - unique_ptr 和 shared_ptr 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6876751/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com