gpt4 book ai didi

c++ - 谁负责在 move 时删除堆分配的对象?

转载 作者:行者123 更新时间:2023-11-28 02:40:09 25 4
gpt4 key购买 nike

用new创建类,然后执行类的move构造函数会发生什么?原作者是否还要负责删除?下面的示例运行良好 ( http://ideone.com/rS2LR9 ),但它不应该在第二个范围内崩溃,因为所有者在 vector 之前超出范围并因此删除了对象吗?

我显然误解了这里的内容,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;
}
}
}

最佳答案

您不会在此处 move 任何数据。当您调用 Owner::get() ,您公开了对 int 的引用, 当你调用 std::move()在那个引用上,你正在做一个微不足道的 Actor 。 std::vector::emplace_back() 没有任何内容从Owner“窃取” ,因为 int没有 move 构造函数。

我猜你认为 std::unique_ptr里面Owner参与这些操作,但它没有;您正在取消引用该指针,但从未尝试 move 其内容。为此,您必须调用 std::unique_ptr的 move 构造函数或赋值运算符。

关于c++ - 谁负责在 move 时删除堆分配的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26264040/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com