我目前正在尝试弄清楚如何使用包含指向已分配内存的指针的对象正确移动语义。我有一个大数据结构,其中包含一个指向实际存储的内部原始指针(出于效率原因)。现在我添加了一个 move 构造函数和 move 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;
}
现在根据我的理解,在 iststd::move( s1 )
上s2
唯一可以安全地s1
调用它的构造函数之后。但是据我所知,这将导致删除s1
析构函数中包含的指针,从而也变得s2
无用。所以我猜我必须做一些事情来使析构函数在std::move()
ing 指针时安全。据我所知,最安全的做法是将其设置0
在移动的对象中,因为这会在delete
以后变成无操作。到目前为止,这个推理是否正确?或者std::move()
实际上足够聪明,可以为我清空指针,使其使用安全?到目前为止,我在实际的测试套件中没有看到任何崩溃,但我还不确定实际调用了移动构造函数。