C++11 std::共享的\u ptr深度复制对象
在C++11中找不到太多关于这方面的内容,但只在boost上找到 考虑以下类别: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
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;
}