Æle*_*lex 12 deep-copy shared-ptr c++11
在C++ 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() ) ) );
}
};
Run Code Online (Sandbox Code Playgroud)
假设类Graph有一个复制构造函数:
Graph( const Graph & graph )
Run Code Online (Sandbox Code Playgroud)
我不想有这个 - > _ graph point/share同一个对象!相反,我希望这个 - > _ graph将对象从state._graph深度复制到我自己的- > _ graph复制中.
是否正确的方式是这样的?
此外,如果g抛出异常,f(shared_ptr(new int(42)),g())可能导致内存泄漏.如果使用make_shared,则不存在此问题.
还有另一种方法可以解决这个问题,更安全或更可靠吗?
如果要在复制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;
}
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助!