繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM