移动std::deque后,原指向其元素的引用/指针是否仍然有效?
问题解答:
std::deque移动构造后原有元素指针的有效性 结论
std::deque通过移动构造函数转移到新对象后,原本指向原std::deque内部元素的指针、引用、迭代器均保持安全有效,行为和std::vector的移动构造完全一致,你可以做出相同的假设。
原理说明
std::deque采用分块连续的存储结构:元素存储在多个固定大小的独立内存块中,容器内部仅通过一个中控指针数组记录这些内存块的地址。- 移动构造
std::deque时,不会对任何存储元素的内存块做拷贝、移动操作,仅会将原deque的中控数组所有权转移给新deque对象,原deque会被置为空状态。元素本身的内存地址没有发生任何变化,因此原有指向元素的指针自然有效。
标准依据
C++标准明确规定:除std::array外,所有标准容器的移动构造函数都保证不会使原容器的迭代器、指针、引用失效。
注:该保证仅针对移动构造场景。如果是移动赋值操作,当两个容器的分配器不满足可移动赋值条件时,可能触发元素的逐个移动,此时原有指针会失效。
示例代码
#include <deque> int main() { std::deque<int> old_deque = {1, 3, 5, 7}; int* elem_ptr = &old_deque[2]; // 指向元素5 std::deque<int> new_deque = std::move(old_deque); // 此时*elem_ptr仍然等于5,访问完全合法 // 注意:old_deque此时处于合法但未指定的空状态,不可再访问其元素 return 0; }
内容的提问来源于stack exchange,提问作者monoceres
相关产品推荐
相关产品推荐

