【问题标题】:What happens to the left hand side std::vector resources on move assignment?移动分配时左侧的 std::vector 资源会发生什么?
【发布时间】:2020-04-10 18:50:21
【问题描述】:

我试图找出 C++ 11 标准是否允许 std::vector 接收移动分配的资源被释放。

我给你举个例子:

std::vector<int> a {1, 2};
std::vector<int> b {3, 4};
a = std::move(b);

现在我期待的是ab 都包装了一个常规数组(通常)并且它们有一个指向它的指针,即a_ptrb_ptr。现在我认为移动分配和其他事情一样a_ptr = b_ptr。标准是否保证a_ptr 中的内存在此之前或之后被释放?

【问题讨论】:

    标签: c++ c++11 vector memory-management move-semantics


    【解决方案1】:

    通过查看Table 71: Container requirements 说明容器的内部结构将被破坏。

    a = rv => All existing elements of a are either move assigned to or destroyed

    正如Howard Hinnant在cmets中提到的那样,有一个特殊情况也在上面的句子中有所说明:

    a 的所有现有元素要么分配给,要么 销毁。

    这个空间案例与移动赋值运算符有关,只有 3 种不同的状态:

    1. propagate_on_container_move_assignment 在 lhs 中是 true

      在这种情况下,lhs 中分配的内存被释放并且移动操作完成。分配器也被移动分配。

    2. propagate_on_container_move_assignment 在 lhs 中是 false 并且双方的分配器是相等的:

      在这种情况下,除了不需要分配给 lhs 分配器之外,执行相同的操作序列。

    3. propagate_on_container_move_assignment 在 lhs 中是 false 并且双方的分配器不相等:

      在这种情况下,由于两个分配器不相等,lhs 容器的分配器不能用于管理 rhs 容器的内存,因此唯一的选择是将分配 rhs 容器项移动到 lhs 容器。

    最后一个案例解释了为什么 lhs 容器中的项目可以移动分配。在任何情况下,内存都会被释放、重用或重新分配。

    【讨论】:

    • 请注意,正确答案取决于分配器。对于std::allocator(如 OP 指定),这是一个正确答案。更多详情见:stackoverflow.com/a/17735913/576911
    • @HowardHinnant 感谢您提醒这一点。我已经编辑了我的答案,请您检查一下答案是否有错误。
    • 看起来很完美! :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-23
    • 1970-01-01
    • 2013-05-10
    • 1970-01-01
    • 2022-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多