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

Who is responsible for deletion of heap allocated object when moving it?

本文关键字:对象 删除 分配 移动      更新时间:2023-10-16

用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;
        }
    }
}

此处没有移动任何数据。当您调用Owner::get()时,您暴露了对int的引用,而当您对该引用调用std::move()时,您正在进行一个琐碎的强制转换。std::vector::emplace_back()没有什么可以从Owner"窃取"的,因为int没有移动构造函数。

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