1

我一直在研究 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>

4

1 回答 1

2

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

这就是它起作用的原因,因为您实际上并没有制作Shared对象的副本。

这可以通过使用共享指针get函数获取“原始”指针来轻松验证:

sharedPtr.get() == ptrCopy.get()
于 2018-06-02T02:29:27.647 回答