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



我一直在搞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; 但是,如果punique_ptr<T>类型,这怎么可能?

std::shared_ptr

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

这就是它工作的原因,因为你实际上并没有复制Shared对象。

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

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