sma*_*llB 223 c++ pointers shared-ptr unique-ptr c++11
有人可以解释shared_ptr和unique_ptr之间的差异吗?
tem*_*def 470
这两个类都是智能指针,这意味着它们会自动(在大多数情况下)释放它们在不再引用该对象时指向的对象.两者之间的区别在于每种类型的指针有多少可以引用资源.
使用时unique_ptr
,最多只能unique_ptr
指向一个资源.当它unique_ptr
被销毁时,资源会自动回收.因为unique_ptr
任何资源只能有一个,所以任何复制a的尝试unique_ptr
都会导致编译时错误.例如,此代码是非法的:
unique_ptr<T> myPtr(new T); // Okay
unique_ptr<T> myOtherPtr = myPtr; // Error: Can't copy unique_ptr
Run Code Online (Sandbox Code Playgroud)
然而,unique_ptr
可移动使用新的移动语义:
unique_ptr<T> myPtr(new T); // Okay
unique_ptr<T> myOtherPtr = std::move(myPtr); // Okay, resource now stored in myOtherPtr
Run Code Online (Sandbox Code Playgroud)
同样,你可以这样做:
unique_ptr<T> MyFunction() {
unique_ptr<T> myPtr(/* ... */);
/* ... */
return myPtr;
}
Run Code Online (Sandbox Code Playgroud)
这个成语意味着"我正在向您返回托管资源.如果您没有明确捕获返回值,那么资源将被清除.如果您这样做,那么您现在拥有该资源的独占所有权." 通过这种方式,您可以将其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.
Run Code Online (Sandbox Code Playgroud)
在内部,shared_ptr
使用引用计数来跟踪有多少指针引用资源,因此您需要注意不要引入任何引用周期.
简而言之:
unique_ptr
时您需要一个指针时单指针被销毁,将被回收的对象.shared_ptr
当您想要多个指向同一资源的指针时使用.希望这可以帮助!
Ker*_* SB 74
unique_ptr
是一个轻量级的智能指针,如果你只有一个动态对象,一个消费者有唯一的(因此"独特")责任 - 可能是一个需要维护一些动态分配对象的包装类.unique_ptr
开销很小.它不可复制,但可移动.它的类型是template <typename D, typename Deleter> class unique_ptr;
,所以它取决于两个模板参数.
unique_ptr
也是auto_ptr
想要在旧的C++中,但由于该语言的限制而无法实现.
shared_ptr
另一方面是一种非常不同的动物.显而易见的区别在于,您可以让许多消费者共同负责动态对象(因此"共享"),并且只有在所有共享指针消失后才会销毁该对象.此外,您可以观察弱指针,如果他们关注的共享指针消失,将会智能地通知它们.
在内部,shared_ptr
还有更多内容:有一个引用计数,它以原子方式更新以允许在并发代码中使用.此外,还有大量的分配,一个用于内部簿记"参考控制块",另一个用于实际的成员对象.
但是还有另一个很大的区别:共享指针类型总是如此 template <typename T> class shared_ptr;
,尽管您可以使用自定义删除器和自定义分配器对其进行初始化.使用类型擦除和虚函数调度来跟踪删除和分配器,这增加了类的内部权重,但是具有巨大的优点,即不同类型的共享指针T
都是兼容的,无论删除和分配细节如何.因此,他们真正表达了"共同责任T
" 的概念,而不会给消费者带来细节!
二者shared_ptr
并unique_ptr
设计成由值传递(与用于唯一的指针明显的可移动性要求).也不应该让你担心开销,因为他们的力量确实令人震惊,但如果你有选择,更喜欢unique_ptr
,只有shared_ptr
在你真正需要共同责任时才使用.
Alo*_*ave 18
unique_ptr
是一个智能指针,它只拥有一个对象.
shared_ptr
是共享所有权的智能指针.这是copyable
和movable
.多个智能指针实例可以拥有相同的资源.一旦拥有资源的最后一个智能指针超出范围,资源就会被释放.
在指针中包装指针时,unique_ptr
不能有多个副本unique_ptr
.的shared_ptr
保持参考计数器,它计数所存储的指针的副本的数目.每次shared_ptr
复制a时,此计数器都会递增.每次a shared_ptr
被破坏时,该计数器递减.当此计数器达到0时,存储的对象将被销毁.
归档时间: |
|
查看次数: |
167107 次 |
最近记录: |