移动时谁负责删除堆分配的对象?

时间:2014-10-08 18:36:59

标签: c++ c++11 move unique-ptr

使用new创建类时会发生什么,然后执行该类的移动构造函数?原创作者是否仍有责任删除?下面的示例运行正常(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;
        }
    }
}

1 个答案:

答案 0 :(得分:2)

您没有在此处移动任何数据。当您致电Owner::get()时,您正在公开对int的引用,当您在该引用上调用std::move()时,您正在进行一次微不足道的演员。 std::vector::emplace_back()没有任何内容可以“偷走”Owner,因为int没有移动构造函数。

我猜你认为std::unique_ptr里面的Owner会参与这些操作,但事实并非如此;您正在取消引用该指针,但从不尝试移动其内容。为此,您必须调用std::unique_ptr的移动构造函数或赋值运算符。