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

C++向vector存指针时所有元素值相同问题求解

错误原因

你的代码存在三个核心问题,直接导致了观察到的异常:

  • 循环内声明的OptimizerPlanOperator planOperator是栈上分配的局部变量,生命周期仅在当前循环迭代范围内,迭代结束时变量会被自动析构。你将它的地址传入shared_ptr后,这个指针从迭代结束起就成为悬空指针,对它的任何访问都属于未定义行为。
  • 循环执行时会复用固定的栈帧空间,每轮迭代的局部变量planOperator都会被分配到完全相同的栈地址,因此你之前存入sources的所有指针实际都指向这同一个栈内存位置。每轮新构造的planOperator会直接覆盖这块内存的内容,就出现了「已存储的所有值都会被更新为最新值」的现象。
  • 存在更严重的崩溃隐患:std::shared_ptr默认会在引用计数归0时对持有地址执行delete操作,但栈内存不是通过new分配的,后续这些shared_ptr析构时会触发非法内存释放,直接导致程序崩溃。
修复方案

不要在栈上构造对象后取地址交给智能指针管理,直接使用std::make_shared在堆上构造被shared_ptr托管的对象,每个对象会拥有独立的堆内存,生命周期由shared_ptr引用计数自动维护:

std::vector<OptimizerPlanOperatorPtr> sources;
// 可选:提前预分配vector容量,避免多次扩容的性能开销
sources.reserve(sourceOperators.size());
for (const auto &source : sourceOperators){
    sources.push_back(std::make_shared<OptimizerPlanOperator>(source));
}

修改后每个元素都指向独立的OptimizerPlanOperator实例,不会再出现地址复用、内容被覆盖的问题,也规避了非法释放栈内存的崩溃风险。

内容的提问来源于stack exchange,提问作者JVS

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.08 16:15:16