unique_ptr和shared_ptr之间的区别

可能重复:
pimpl:shared_ptr或unique_ptr
智能指针(boost)解释

有人可以解释shared_ptr和unique_ptr之间的区别吗?

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

使用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; } 

这个习惯用法的意思是“我向你返回一个托pipe资源,如果你没有明确地获取返回值,那么资源将被清理,如果你这样做,那么你现在拥有这个资源的独占所有权。 通过这种方式,您可以将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使用引用计数来跟踪有多less指针指向一个资源,所以你需要小心不要引入任何引用周期。

简而言之:

  1. 当你想要一个指向一个对象的唯一指针时,使用unique_ptr ,这个指针将被销毁。
  2. 当你想要多个指针到同一个资源时使用shared_ptr

希望这可以帮助!

unique_ptr是轻量级的智能指针,如果你只是有一个dynamic对象,某个消费者有唯一(因此是唯一的)责任 – 也许是一个需要维护一些dynamic分配对象的包装类。 unique_ptr开销很小。 它不可复制,但可移动。 它的typestemplate <typename D, typename Deleter> class unique_ptr; ,所以它取决于两个模板参数。

unique_ptr也是auto_ptr想要在旧的C ++,但不能因为该语言的限制。

另一方面shared_ptr是一个非常不同的动物。 显而易见的区别是,你可以让许多消费者共享一个dynamic对象(因此是“共享”)的责任,并且只有当所有共享指针消失时,对象才会被销毁。 此外,您可以观察弱指针 ,如果他们所关注的共享指针消失,这些指针将被智能地通知。

在内部, shared_ptr还有很多事情要做:有一个引用计数,这个引用计数primefaces地更新以允许在并发代码中使用。 此外,还有大量的分配,一个用于内部簿记“参考控制块”,另一个用于实际的成员对象。

但是还有一个很大的区别:共享指针types总是 template <typename T> class shared_ptr; ,尽pipe您可以使用自定义删除器自定义分配器来初始化它。 删除器和分配器使用types擦除和虚函数调度进行跟踪,这增加了类的内部权重,但是具有typesT不同types的共享指针都兼容的巨大优点,不pipe删除和分配细节如何。 从而真正expression了“共同承担责任”的概念,而不会给消费者带来细节的负担!

shared_ptrunique_ptr都被devise为按值传递(对于唯一指针具有明显的可移动性要求)。 既然他们的威力真的令人震惊,你也不应该让你担心开销,但是如果你有select的话,更喜欢unique_ptr ,而且如果你真的需要分担责任,只能使用shared_ptr

的unique_ptr
是一个专门拥有一个对象的智能指针。

shared_ptr的
是共享所有权的智能指针。 它既可copyable movable 。 多个智能指针实例可以拥有相同的资源。 只要拥有资源的最后一个智能指针超出范围,资源就会被释放。

当在unique_ptr包装一个指针时,你不能拥有unique_ptr多个副本。 shared_ptr保存一个参考计数器,它对存储的指针的拷贝数进行计数。 每次复制shared_ptr ,该计数器都会增加。 每次shared_ptr被销毁时,这个计数器都会减less。 当这个计数器达到0时,存储的对象被销毁。