【发布时间】:2014-10-08 18:36:58
【问题描述】:
用new创建类,然后执行类的move构造函数会发生什么?原作者还负责删除吗?下面的示例运行良好(http://ideone.com/rS2LR9),但它不应该在第二个范围内崩溃,因为所有者在向量之前超出范围并因此删除了对象?
我显然在这里误解了一些东西,std::move之后的所有权会发生什么?
#include <iostream>
#include <memory>
#include <vector>
#include <utility>
class Owner {
public:
Owner() : data_(new int(1)) {}
int& get() {return *data_;}
private:
std::unique_ptr<int> data_;
Owner(const Owner&) = delete;
void operator=(const Owner&) = delete;
};
int main()
{
{
Owner owner;
std::vector<int> test;
test.emplace_back(std::move(owner.get()));
std::cout << test[0] << std::endl;
}
{
std::vector<int> test;
{
Owner owner;
test.emplace_back(std::move(owner.get()));
}
std::cout << test[0] << std::endl;
}
{
Owner owner;
{
std::vector<int> test;
test.emplace_back(std::move(owner.get()));
std::cout << test[0] << std::endl;
}
}
}
【问题讨论】:
-
移动的对象处于有效但未指定的状态。为此,一旦对象超出范围,将调用移动对象的析构函数。一个对象的移动并不意味着这个对象真的被移动了,而是另一个对象窃取了被移动对象的内存。
标签: c++ c++11 move unique-ptr