2013-04-09 93 views
1

我有一个包含boost :: shared_array成员的类。其他成员不是动态的 - 只是一堆整数,没有指针。我期望这样的类的默认拷贝构造函数可以。boost :: shared_ *具有复制构造函数和赋值运算符

这是我的假设:

  1. 比方说,我有这个类的一个实例,原稿
  2. 原稿的shared_array构件具有1
  3. 参考计数现在我创建原稿的副本:

    副本=原稿;

  4. 我现在都期盼副本原稿有指向同一内存shared_arrays,各有2

引用计数就是上面是否正确?

当有一个boost :: shared_ *成员的时候,我被许多人对默认的拷贝构造函数提出警告 - 但我永远无法找到解释为什么默认会/可能会变糟的解释。例如,这里的人谁说一个明确的复制/分配应定义的注释,但没有解释原因:一类中定义

当一个拷贝构造函数和赋值操作符需要

https://stackoverflow.com/a/716112/629530

有人能澄清包含boost :: shared_ *(shared_array和shared_ptr)成员?

+0

从技术上讲,默认的拷贝构造函数是正确的。但是,它只创建浅拷贝而不是深拷贝。但大多数人都期望副本很深,即与原始对象无关。 – nosid 2013-04-09 20:30:54

+0

谢谢nosid。为了澄清,你是否说我从我给出的例子中得到的理解是正确的?无论如何,我鼓励你在回复中补充一点,因为如果有帮助,我会提高你的答案。 – firebush 2013-04-10 15:57:04

回答

1

下面的类使用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; 
    } 
    // ... 
}; 

代码编译和作品。但是,有一个奇怪的行为:

location london{51.51, 0.12}; 
location paris = london; 
paris.move_to(48.86, 2.35); 
std::cout << "London: " << london << '\n'; // prints 48.86/2.35 

更改对象的副本也影响原始对象。在这种情况下,最好使用std::unique_ptr而不是std::shared_ptr,因为我们会被迫写我们自己的拷贝构造函数。

还有一些情况需要std::shared_ptr的行为。让我们添加一个成员变量metric将被用于计算两个位置之间的距离(因为有可能是计算距离不同的策略):

std::shared_ptr<metric> _metric; 
    double operator-(const location& rhs) const 
    { 
     return _metric->distance(*_impl, *rhs->_impl); 
    } 

在这种情况下,std::shared_ptr作品完美,因为度量不属于的感知状态的位置,并且没有办法改变度量。

+0

非常好,谢谢!接受答案。除了您的评论之外,我还明确指出,在您的两个示例中,即使共享共享资源,与shared_ptr关联的“安全性”也不会受到影响。也就是说,伦敦和巴黎的指标都会超出范围而不是之前。正如您演示的那样,问题是这个共享内存位置的浅拷贝是否是需要的。 – firebush 2013-04-13 02:56:28

相关问题