当创建其对象包含唯一指针的共享指针的副本时会发生什么?

时间:2018-06-02 02:27:03

标签: c++11 smart-pointers ownership-semantics

我一直在搞乱SFML,弄清楚如何构建一个简单的2D游戏。我刚注意到这种行为,无法弄清楚发生了什么。令我困惑的示例代码:

struct Unique {};

class Shared {
public:
    Shared() {
        p = make_unique<Unique>();
    }
    unique_ptr<Unique> p;
};

void SharedCopyTest() {
    Shared foo;
    //Shared copy = foo;    // Error: function "Shared::Shared(const Shared &)" 
                            // (declared implicitly) cannot be referenced 
                            // -- it is a deleted function

    shared_ptr<Shared> sharedPtr = make_shared<Shared>();
    shared_ptr<Shared> ptrCopy = sharedPtr; // No error
}

此时,&sharedPtr->p == &ptrCopy->p;但如果p的类型为unique_ptr<T>,那又怎么可能?

1 个答案:

答案 0 :(得分:2)

std::shared_ptr的语义是没有指向对象的副本。相反,它是复制的std::shared_ptr对象本身,它会增加共享指针的使用计数器。

这就是为什么它有效,因为你实际上没有复制Shared对象。

这可以通过使用共享指针get函数轻松验证,以获得&#34; raw&#34;指针:

sharedPtr.get() == ptrCopy.get()