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)
现在我所期望的是,a和b都包装了一个常规数组(通常)并且它们有一个指向它的指针,即a_ptrand b_ptr。现在我认为除其他外的移动分配确实如此a_ptr = b_ptr。标准是否保证在a_ptr此之前或通过此释放内存?
通过查看表 71:容器要求,声明容器的内部结构将被破坏。
a = rv => All existing elements of a are either move assigned to or destroyed
正如Howard Hinnant评论中提到的,有一个特殊情况也在上面的句子中说明:
a 的所有现有元素要么被移动分配,要么被销毁。
这个空间案例与移动赋值运算符有关,并且只有 3 种不同的状态:
propagate_on_container_move_assignment是true在LHS:
在这种情况下,lhs 中分配的内存被释放并完成移动操作。分配器也被移动分配。
propagate_on_container_move_assignment是false在LHS和双方的分配器是平等的:
在这种情况下,除了不需要分配给 lhs 分配器之外,还会执行相同的操作序列。
propagate_on_container_move_assignment是false在LHS和双方的分配器是不相等的:
在这种情况下,因为两个分配器不相等,所以 lhs 容器的分配器不能用于管理 rhs 容器的内存,所以唯一的选择是将分配 rhs 容器项移动到 lhs 容器。
最后一个案例解释了为什么 lhs 容器中的项目可以被移动分配。在任何情况下,内存都将被释放、重用或重新分配。