Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++11 std::共享的\u ptr深度复制对象_C++11_Shared Ptr_Deep Copy - Fatal编程技术网

C++11 std::共享的\u ptr深度复制对象

C++11 std::共享的\u ptr深度复制对象,c++11,shared-ptr,deep-copy,C++11,Shared Ptr,Deep Copy,在C++11中找不到太多关于这方面的内容,但只在boost上找到 考虑以下类别: class State { std::shared_ptr<Graph> _graph; public: State( const State & state ) { // This is assignment, and thus points to same object this->_graph = std::make_sha

在C++11中找不到太多关于这方面的内容,但只在boost上找到

考虑以下类别:

class State
{
   std::shared_ptr<Graph> _graph;

 public:

    State( const State & state )
    {
        // This is assignment, and thus points to same object
        this->_graph = std::make_shared<Graph>( state._graph ); 

        // Deep copy state._graph to this->_graph ?
        this->_graph = std::shared_ptr<Graph>( new Graph( *( state._graph.get() ) ) );

        // Or use make_shared?
        this->_graph = std::make_shared<Graph>( Graph( *( state._graph.get() ) ) );
    }   
};
我不想让这个->\u图形指向/共享同一个对象! 相反,我希望此->\u图将对象从状态深度复制到我自己的此->\u图副本中

上面的方法是正确的吗

注意到:

此外,f(shared_ptr(new int(42)),g()可能导致内存泄漏 如果g抛出一个异常。如果共享make_,则不存在此问题 用过


是否有其他更安全或更可靠的方法来实现此目的?

如果要在复制对象时复制
图形
对象,则始终可以定义复制构造函数和赋值运算符来执行此操作:

State::State(const State& rhs) : _graph(std::make_shared(*rhs._graph)) {
   // Handled by initializer list
}
State::State(State&& rhs) : _graph(std::move(rhs._graph)) {
   // Handled by initializer list
}
State& State::operator= (State rhs) {
    std::swap(*this, rhs);
    return *this;
}

希望这有帮助

如果希望每个对象指向其自己的
图形
,是否有使用
共享\u ptr
的原因?另一种指针类型似乎更合适,将
图形作为直接子对象也更合适。是的,它们属于其他类。但是在这个特殊的情况下,我真的需要一个复制品,而不是分享我想要改变的给定对象,而不希望改变原始对象。你建议我改用unique_ptr?这本来是我的建议之一,但是如果这个对象真的是共享的,那么还有很多其他的好方法。我现在更好奇了。您拥有的第一个副本构造函数只分配相同的图,不是吗?第二个使用move,它将移动而不是复制对象,否?复制构造函数将
\u graph
初始化为
std::shared\u ptr
,指向一个全新的
graph
对象,该对象初始化为原始图的副本。这意味着它最终指向一个与原始图形分离的新的
图形。在move构造函数中,我们只需将现有的
共享\u ptr
移出现有的
状态
对象,因为该对象将不再使用
(请注意星号!)将调用
Graph
的copy ctor,因为
make_shared
将参数传递给一个ctor,并且
*状态。_Graph
提供了对共享\u ptr管理的对象的引用。采用自己类型的引用的ctor将是复制ctor(假设有一个)。如果您只想与另一个共享的\u ptr共享所有权,那么它将是
\u graph(state.\u graph)
(共享的\u ptr的副本)。当您想要一个新的
T
对象(包装在共享的\u ptr中)时,您只需要
make_shared
State::State(const State& rhs) : _graph(std::make_shared(*rhs._graph)) {
   // Handled by initializer list
}
State::State(State&& rhs) : _graph(std::move(rhs._graph)) {
   // Handled by initializer list
}
State& State::operator= (State rhs) {
    std::swap(*this, rhs);
    return *this;
}