代码之家  ›  专栏  ›  技术社区  ›  Pavel

复制构造函数首先复制指针,然后取消引用以获得“深度”复制

  •  2
  • Pavel  · 技术社区  · 6 年前

    我正在查看以下(坏的)示例代码 http://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#c22-make-default-operations-consistent :

    class Silly {   // BAD: Inconsistent copy operations
        class Impl {
            // ...
        };
        shared_ptr<Impl> p;
    public:
        Silly(const Silly& a) : p{a.p} { *p = *a.p; }   // deep copy
        Silly& operator=(const Silly& a) { p = a.p; }   // shallow copy
        // ...
    };
    

    作者试图说明复制任务和复制分配之间的不匹配,但我想知道代码是否有其他方面的缺陷。

    “深度复制”构造函数是否有意义?看起来像是进入身体, p 将与 a.p 而自我分配并没有做任何事情(充其量)。

    我错过什么了吗?

    2 回复  |  直到 6 年前
        1
  •  3
  •   Lightness Races in Orbit    6 年前

    事实上,那不过是胡说八道。

    大概这就是例子的重点,尽管我不相信它是一个很好的例子。

    否则,作者的意思可能是:

    Silly(const Silly& a) : p{std::make_shared<Impl>()} { *p = *a.p; }
    

    或:

    Silly(const Silly& a) : p{std::make_shared<Impl>(*a.p)} {}
    

    或者一些。

        2
  •  0
  •   Vivick    6 年前
    Silly(const Silly& a) : p{a.p} { *p = *a.p; }
    

    将,除了复制基础的共享\指针之外,还将复制它所指向的值。我担心的是 shared_ptr<T>::operator* 实际回报 T& 因此,我们的分配将更改控制块的值,实际上什么也没有完成。

    但是,同样,目的不是演示实际的深度复制,而是提供不一致的复制操作。

    A的深度拷贝 shared_ptr 像这样吗

    Silly(const Silly& a) : p{make_shared<Impl>(*a.p)} {}