移动分配时左侧 std::vector 资源会发生什么变化?

Ala*_*anu 3 c++ memory-management vector move-semantics c++11

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

我给你举个例子:

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

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

MRB*_*MRB 7

通过查看表 71:容器要求,声明容器的内部结构将被破坏。

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

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

a 的所有现有元素要么被移动分配,要么被销毁。

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

  1. propagate_on_container_move_assignmenttrue在LHS:

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

  2. propagate_on_container_move_assignmentfalse在LHS和双方的分配器是平等的:

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

  3. propagate_on_container_move_assignmentfalse在LHS和双方的分配器是不相等的:

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

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