指针数组对所有元素保持相同的值

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 的所有值 更改为最近的值。

我的假设是,我在这里对指针进行了糟糕的初始化,这不知何故导致指针指向的值被覆盖。

有人可以提供解决方案或解释一下我在这里做错了什么吗?

你的planOperator是栈上的局部变量,当你将它传递给强制转换static_cast<std::shared_ptr<OptimizerPlanOperator>(&planOperator)时,你传递的是局部变量的地址,所以一旦迭代结束,指针 &planOperator 变成垃圾。

您正在存储一个对象的位置,该对象的生命周期以当前迭代结束并且将其所有权移交给shared_ptr。两者都是导致未定义行为的问题。

将指针转换为std::shared_ptr不会自动使pointed-to对象成为共享对象并延长其生命周期,它等同于std::shared_ptr<OptimizerPlanOperator>(&planOperator).

最简单的解决方案是不要逐步执行此操作,而是一次性完成:

for (const auto &source : sourceOperators){
    sources.push_back(std::make_shared<OptimizerPlanOperator>(source));
}