[英]Array of pointers holds the same value for all elements
我目前正在深入研究指针的工作方式。
执行以下代码行时发生了一些对我来说无法解释的事情:
std::vector<OptimizerPlanOperatorPtr> sources;
for (const auto &source : sourceOperators){
OptimizerPlanOperator planOperator = OptimizerPlanOperator(source);
sources.push_back(static_cast<std::shared_ptr<OptimizerPlanOperator>(&planOperator));
}
所有sourceOperators
都不同,但是在检查sources
的元素时,它们都指向相同的OptimizerPlanOperator
。
当我运行调试器时,我意识到在每个循环步骤中, sources
的所有值都会更改为最近的值。
我的假设是,我在这里对指针进行了糟糕的初始化,这不知何故导致指针所指的值被覆盖。
有人可以提供解决方案或解释我在这里做错了什么吗?
您正在存储 object 的位置,其生命周期以当前迭代结束,并将其所有权交给shared_ptr
。 两者都是导致未定义行为的问题。
将指针转换为std::shared_ptr
不会自动将指向的 object 变成共享的 object 并延长其生命周期,它等同于std::shared_ptr<OptimizerPlanOperator>(&planOperator)
。
最简单的解决方案是不要逐步执行此操作,而是一次执行所有操作:
for (const auto &source : sourceOperators){
sources.push_back(std::make_shared<OptimizerPlanOperator>(source));
}
您的planOperator
是堆栈上的局部变量,当您将其传递给强制转换static_cast<std::shared_ptr<OptimizerPlanOperator>(&planOperator)
时,您传递的是局部变量的地址,因此一旦迭代结束了,那个指针&planOperator
变成了垃圾。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.