boost::与复制构造函数和赋值运算符共享
我有一个包含boost::shared_数组成员的类。其他成员不是动态的-只是一堆int,没有指针。我希望这样一个类的默认复制构造函数可以 这是我的假设: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_*(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);
}