boost::与复制构造函数和赋值运算符共享

boost::与复制构造函数和赋值运算符共享,boost,shared-ptr,copy-constructor,Boost,Shared Ptr,Copy Constructor,我有一个包含boost::shared_数组成员的类。其他成员不是动态的-只是一堆int,没有指针。我希望这样一个类的默认复制构造函数可以 这是我的假设: 假设我有这个类的一个实例,orig orig的共享数组成员的引用计数为1 现在我创建了一个orig的副本: 复印件=原件 我现在希望copy和orig都有指向相同底层内存的共享_数组,每个数组的引用计数为2 以上是正确的吗 我被各种各样的人吓坏了,他们在有boost::shared_*成员时警告不要使用默认的复制构造函数,但我永远找不

我有一个包含boost::shared_数组成员的类。其他成员不是动态的-只是一堆int,没有指针。我希望这样一个类的默认复制构造函数可以

这是我的假设:

  • 假设我有这个类的一个实例,orig

  • orig的共享数组成员的引用计数为1

  • 现在我创建了一个orig的副本:

    复印件=原件

  • 我现在希望copy和orig都有指向相同底层内存的共享_数组,每个数组的引用计数为2

  • 以上是正确的吗

    我被各种各样的人吓坏了,他们在有boost::shared_*成员时警告不要使用默认的复制构造函数,但我永远找不到解释为什么默认会/可能是坏的。例如,有人评论说应该定义明确的副本/分配,但没有解释为什么:


    有人能澄清什么时候需要为包含boost::shared_*(shared_数组和shared_ptr)成员的类定义复制构造函数和赋值运算符吗?

    下面的类将Pimpl习惯用法与shared_ptr结合使用:

    class location
    {
        struct impl
        {
            double _latitude;
            double _longitude;
        };
        std::shared_ptr<impl> _impl;
    public:
        location(double latitude, double longitude)
            : _impl{new impl{latitude, longitude}}
        { }
        void move_to(double latitude, double longitude)
        {
            _impl->_latitude = latitude;
            _impl->_longitude = longitude;
        }
        // ...
    };
    

    在这种情况下,
    std::shared_ptr
    工作得非常好,因为度量不是位置感知状态的一部分,并且无法更改度量。

    以下类将Pimpl惯用法与共享_ptr结合使用:

    class location
    {
        struct impl
        {
            double _latitude;
            double _longitude;
        };
        std::shared_ptr<impl> _impl;
    public:
        location(double latitude, double longitude)
            : _impl{new impl{latitude, longitude}}
        { }
        void move_to(double latitude, double longitude)
        {
            _impl->_latitude = latitude;
            _impl->_longitude = longitude;
        }
        // ...
    };
    

    在这种情况下,一个
    std::shared_ptr
    可以完美地工作,因为度量不是位置感知状态的一部分,并且无法更改度量。

    从技术上讲,默认的复制构造函数是正确的。但是,它只创建浅拷贝而不是深拷贝。但大多数人都认为复制品很深,即独立于原始对象。谢谢nosid。我只是想澄清一下,你是说我对我举的例子的理解是正确的吗?不管怎样,我鼓励你在回复中进一步充实这一点,因为如果有帮助的话,我会投票支持你的答案。从技术上讲,默认的复制构造函数是正确的。但是,它只创建浅拷贝而不是深拷贝。但大多数人都认为复制品很深,即独立于原始对象。谢谢nosid。我只是想澄清一下,你是说我对我举的例子的理解是正确的吗?不管怎样,我鼓励你在回答中把这一点充实一点,因为如果你的答案有帮助的话,我会投票给你。非常好,谢谢!答案被接受。除了您的评论之外,我还明确指出,在您的两个示例中,即使共享了公共资源,也不会损害与共享ptr相关的“安全”。也就是说,当伦敦和巴黎都不在范围内时,它们将删除指针。正如您所演示的,问题在于是否需要共享内存位置的浅拷贝。非常好,谢谢!答案被接受。除了您的评论之外,我还明确指出,在您的两个示例中,即使共享了公共资源,也不会损害与共享ptr相关的“安全”。也就是说,当伦敦和巴黎都不在范围内时,它们将删除指针。正如您所演示的,问题在于是否需要共享内存位置的浅拷贝。
        std::shared_ptr<metric> _metric;
        double operator-(const location& rhs) const
        {
            return _metric->distance(*_impl, *rhs->_impl);
        }