gpt4 book ai didi

c++ - move 分配时左侧 std::vector 资源会发生什么情况?

转载 作者:行者123 更新时间:2023-12-01 19:21:05 25 4
gpt4 key购买 nike

我试图查明 C++ 11 标准是否授予 std::vector 的资源接收 move 分配的任务被释放。

我给你举个例子:

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

现在我期望的是 ab (通常)包装一个常规数组,并且它们有一个指向它的指针,即 a_ptrb_ptr 。现在我认为除其他事项外的 move 分配确实a_ptr = b_ptr 。标准是否保证a_ptr中的内存是在此之前或之后释放的?

最佳答案

查看 Table 71: Container requirements据说容器的内部结构会被破坏。

a = rv => a 的所有现有元素要么被 move 分配,要么被销毁

正如 Howard Hinnant 在评论中提到的,有一种特殊情况在上面的句子中也有说明:

All existing elements of a are either move assigned to or destroyed.

这个特殊情况与 move 赋值运算符相关,并且只有 3 种不同的状态:

  1. propagate_on_container_move_assignment 在 lhs 中为 true:

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

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

    在这种情况下,将完成相同的操作序列,只是不需要分配给 lhs 分配器。

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

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

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

关于c++ - move 分配时左侧 std::vector 资源会发生什么情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59388277/

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