指针数组对所有元素保持相同的值
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));
}
我目前正在深入研究指针的工作方式。
执行以下代码行时发生了我无法解释的事情:
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));
}