谁负责在移动堆分配的对象时删除该对象
Who is responsible for deletion of heap allocated object when moving it?
用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构造函数或赋值运算符。
相关文章:
- 线程调用的函数对对象删除是否安全?
- 当我使用dynamic_cast并删除对象删除时,析构函数是如何工作的?
- 使用 com 对象删除计划任务
- C 将对象删除为参考
- C样式对象删除的包装器
- 静态映射中动态分配的对象.删除必要的
- C++指向对象删除的指针数组,"Debug assertion failure!"
- 在其成员函数返回之前,将对象删除是不确定的行为吗?
- Python 对象删除检测
- C++安全对象删除
- Qt:RemoveWidget和对象删除
- Qt对象删除导致崩溃
- 删除由两个shared_pointer实例管理的对象(删除其中一个)
- 顶点缓冲区对象(删除进程)opengl
- 设计 -- 按名称或对象删除
- 提升中的异常:进程间,共享内存对象删除
- 使用std::function和std::bind来存储回调并处理对象删除
- 如何使用智能指针防止双重对象删除
- 指针指向对象删除时自动为空
- 对象层次结构中的对象删除责任