我目前正在尝试正确地使用移动语义处理包含指向分配内存的指针的对象。我有一个大数据结构,其中包含对实际存储的内部原始指针(出于效率原因)。现在我添加了一个移动构造函数和移动
以下是我正在执行的简单示例:
现在我所理解的是,经过将
operator=()
。在这些方法中,我将指针std::move()
到新结构中。但是我不确定如何处理来自其他结构的指针。以下是我正在执行的简单示例:
class big_and_complicated {
// lots of complicated code
};
class structure {
public:
structure() :
m_data( new big_and_complicated() )
{}
structure( structure && rhs ) :
m_data( std::move( rhs.m_data ) )
{
// Maybe do something to rhs here?
}
~structure()
{
delete m_data;
}
private:
big_and_complicated * m_data;
}
int main() {
structure s1;
structure s2( std::move( s1 ) );
return 0;
}
现在我所理解的是,经过将
std::move( s1 )
移动到 s2
后,唯一安全的操作是调用 s1
的构造函数。然而据我所知,这会导致在析构函数中删除 s1
中包含的指针,从而使 s2
也变得无用。因此,我猜测在对指针进行 std::move()
时,我必须做一些工作以使析构函数变得安全。据我所见,最安全的做法是将其设置为移动后对象中的 0
,因为这样可以将 delete
变为以后的 no-op。迄今为止,我的推理是否正确?或者说,std::move()
是否真正聪明地将指针置空,使其使用安全?到目前为止,在实际测试套件中我没有遇到崩溃,但我还没有确定移动构造函数实际上是否被调用。
std::shared_ptr<>
和std::weak_ptr<>
的可能候选。 :-] - ildjarn