这个问题已经在这里有了答案:




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/

    10-10 19:59