gpt4 book ai didi

c++ - 当源 obj 被销毁时,使用 move cstor 是否会丢失内存?

转载 作者:行者123 更新时间:2023-11-28 00:10:28 24 4
gpt4 key购买 nike

假设我有课

MyClass {
//.. cstors and dstor
void MyClass(MyClass&& source) : some_obj_(std::move(source.some_obj_));
SomeObj some_obj_;
}

假设我做了以下事情:

// a1 is defined somewhere else with a wider scope
MyClass a1;
...
// a2 is defined locally and will go out of scope soon
MyClass a2;
... //Populate a2's some_obj_ field with data
a1 = std::move(a2); // move instead of copy

在这种情况下,将调用 move 构造函数。据我了解, move 构造函数在两者之间交换字段指针,这样就不会发生复制。

所以我的问题来了。当 a2 被实例化时,它在 a2 内部为字段 some_obj_ 分配内存。当 move 发生时,我们交换指针,以便现在 a1some_obj_ 指向 a2 持有的内存块(而不是复制它在自己的内存空间)。将来,当 a2 超出范围时,例如包含 a2 的函数返回,因此堆栈帧被清理,因为 a2.some_obj_ 驻留在 a2 中,它也被删除。由于a1.some_obj_ move 后,指向a2的内存现在已经被清理了,a1是否丢失了那部分信息?

看来按照上面的逻辑,a1现在会指向无效的内存空间。

最佳答案

这是 move 类的典型实现

template<typename T>
struct moving
{
moving()=default;
explicit moving(size_t n)
: ptr(new T[n]) {}
moving(moving const&)=delete;
moving&operator=(moving const&)=delete;
moving(moving&&m)
: ptr(m.ptr) { m.ptr=nullptr; }
moving&operator=(moving&&m)
{ if(this!=&m) { delete ptr; ptr=m.ptr; m.ptr=nullptr; } return*this; }
private:
T*ptr=nullptr;
};

所以你可以自己弄清楚会发生什么。

请注意, move 语义仅与管理外部资源的情况相关(例如保存分配内存地址的指针或某种类型的库管理资源(如 HDF5 id)的句柄)。对于其他普通数据, move 与复制没有区别。

关于c++ - 当源 obj 被销毁时,使用 move cstor 是否会丢失内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33403471/

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