【发布时间】:2012-01-26 22:03:41
【问题描述】:
我目前正在尝试弄清楚如何使用包含指向已分配内存的指针的对象正确执行移动语义。我有一个大数据结构,其中包含一个指向实际存储的内部原始指针(出于效率原因)。现在我添加了一个移动构造函数并移动operator=()。在这些方法中,我 std::move()ing 指向新结构的指针。但是我不确定如何处理来自其他结构的指针。
这是我正在做的一个简单示例:
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()ing 指针时做一些事情来使析构函数安全。据我所知,这里最安全的做法是将其设置为移动对象中的0,因为这会在以后将delete 变为无操作。到目前为止,这个推理是否正确?或者std::move() 是否真的足够聪明,可以为我清空指针,使其使用安全?到目前为止,我在实际的测试套件中没有看到任何崩溃,但我不确定实际调用了 move-constructor。
【问题讨论】:
标签: c++ c++11 rvalue-reference move-semantics