You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

移动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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 19:54:06