当创建一个共享指针的副本时会发生什么,其对象包含一个唯一指针?
What happens when a copy of a shared pointer is created whose object contains a unique pointer?
我一直在研究 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>
?
怎么可能
std::shared_ptr
的语义是不对指向的对象进行复制。相反,复制的是 std::shared_ptr
对象本身,它增加了共享指针的使用计数器。
这就是它起作用的原因,因为您实际上并没有复制 Shared
对象。
这可以通过使用共享指针 get
函数获取 "raw" 指针来轻松验证:
sharedPtr.get() == ptrCopy.get()
我一直在研究 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>
?
std::shared_ptr
的语义是不对指向的对象进行复制。相反,复制的是 std::shared_ptr
对象本身,它增加了共享指针的使用计数器。
这就是它起作用的原因,因为您实际上并没有复制 Shared
对象。
这可以通过使用共享指针 get
函数获取 "raw" 指针来轻松验证:
sharedPtr.get() == ptrCopy.get()