18

在 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() ) ) );
    }   
};

假设类 Graph确实有一个复制构造函数:

Graph( const Graph & graph )

我不想让this->_graph指向/共享同一个对象!相反,我希望this->_graph将对象从state._graph深度复制到我自己的this->_graph副本中。

上面的方法是正确的方法吗?

std::make_shared 的文档指出:

此外,如果 g 抛出异常, f(shared_ptr(new int(42)), g()) 可能会导致内存泄漏。如果使用 make_shared 则不存在此问题。

有没有其他方法可以解决这个问题,更安全或更可靠?

4

1 回答 1

11

如果要在复制Graph对象时复制对象,则始终可以定义复制构造函数和赋值运算符来做到这一点:

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;
}

希望这可以帮助!

于 2013-11-14T04:18:47.940 回答