【问题标题】:What happens when a copy of a shared pointer is created whose object contains a unique pointer?当创建对象包含唯一指针的共享指针副本时会发生什么?
【发布时间】:2018-11-12 03:49:51
【问题描述】:

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

此时,&amp;sharedPtr-&gt;p == &amp;ptrCopy-&gt;p;但是,如果p 的类型是unique_ptr&lt;T&gt;,这怎么可能?

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 有道理,谢谢!因此,如果一个类包含unique_ptr&lt;T&gt; 成员,编译器将自动删除复制构造函数和复制赋值运算符,我是否不必为我构造的任何此类显式删除它们而烦恼?这个挺方便的!
    猜你喜欢
    • 1970-01-01
    • 2021-11-06
    • 1970-01-01
    • 2022-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多