Std:: shared_ptr объект с глубокой копией

Невозможно найти многого для С++ 11, но только для повышения.

Рассмотрим следующий класс:

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 в мой собственный этот → график.. p >

Является ли путь выше правильного пути для этого?

Документация std:: make_shared отмечает, что:

Кроме того, f (shared_ptr (new int (42)), g()) может привести к утечке памяти если g выбрасывает исключение. Эта проблема не существует, если make_shared б.

Есть ли другой способ сделать это, безопаснее или надежнее?

Ответ 1

Если вы хотите сделать копию объекта 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;
}

Надеюсь, это поможет!