唯一指標向量:為什麼push_back被拒絕以及如何克服它
在C中,當我們嘗試儲存唯一值時遇到了一個絆腳石向量中的指標。向量容器期望元素允許複製,而唯一指標嚴格遵守唯一所有權原則。
考慮以下程式碼片段:
std::vector<std::unique_ptr<int>> vec; int x(1); std::unique_ptr<int> ptr2x(&x); vec.push_back(ptr2x); // Compiler error: attempt to copy unique pointer
此錯誤源自於 unique_ptr 的設計,以確保唯一性所有權。複製 unique_ptr 會違反這個基本屬性,損害其核心目的。
透過移動來解決困境
要解決這個問題,我們必須使用「移動」操作而不是複製。移動操作將所有權從一個容器轉移到另一個容器,確保不重複。
vec.push_back(std::move(ptr2x));
透過此修改,程式碼成功將 unique_ptr 插入向量中,保持其獨佔所有權。
注意事項
需要注意的是,使用 unique_ptr 來管理指向不建議使用像「x」這樣的局部變數。局部變數在區塊退出期間自動處理(例如,本例中的函數傳回)。相反,您應該動態分配物件。
std::unique_ptr<int> ptr(new int(1));
在 C 14 中,我們可以使用 make_unique 進一步簡化:
std::make_unique<int>(5);
以上是為什麼我不能將唯一指標「push_back」放入向量中,如何修復它?的詳細內容。更多資訊請關注PHP中文網其他相關文章!