这个问题已经在这里有了答案:
9年前关闭。
有人可以解释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
但是,可以使用新的move语义移动
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跟踪引用一个资源的指针数量,因此您需要注意不要引入任何引用周期。简而言之:
unique_ptr
。 shared_ptr
。 希望这可以帮助!
关于c++ - unique_ptr和shared_ptr之间的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6876751/