我目前正在深入研究指標的作業方式。
執行以下代碼行時發生了一些對我來說無法解釋的事情:
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
更改為最近的值。
我的假設是,我在這里初始化得很差,這會導致指標所指的值被覆寫。
有人可以提出解決方案或解釋,我在這里做錯了什么嗎?
uj5u.com熱心網友回復:
您正在存盤一個物件的位置,該物件的生命周期以當前迭代結束,并將其所有權交給shared_ptr. 兩者都是導致未定義行為的問題。
將指標強制轉換為std::shared_ptr不會自動使指向的物件成為共享物件并延長其生命周期,它等效于std::shared_ptr<OptimizerPlanOperator>(&planOperator).
最簡單的解決方案是不要逐步執行此操作,而是一次性執行此操作:
for (const auto &source : sourceOperators){
sources.push_back(std::make_shared<OptimizerPlanOperator>(source));
}
uj5u.com熱心網友回復:
你planOperator是堆疊上的一個區域變數,當你將它傳遞給 caststatic_cast<std::shared_ptr<OptimizerPlanOperator>(&planOperator)時,你傳遞的是一個區域變數的地址,所以一旦迭代結束,那個指標&planOperator就會變成垃圾。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/454249.html
上一篇:c :通過參考傳遞陣列
