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指针指向一个资源,所以你需要小心不要引入任何引用周期。
简而言之:
- 当你想要一个指向一个对象的唯一指针时,使用
unique_ptr
,这个指针将被销毁。 - 当你想要多个指针到同一个资源时使用
shared_ptr
。
希望这可以帮助!
unique_ptr
是轻量级的智能指针,如果你只是有一个dynamic对象,某个消费者有唯一(因此是唯一的)责任 – 也许是一个需要维护一些dynamic分配对象的包装类。 unique_ptr
开销很小。 它不可复制,但可移动。 它的types是template <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_ptr
和unique_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时,存储的对象被销毁。