首頁 > 後端開發 > C++ > 為什麼我不能將唯一指標「push_back」放入向量中,如何修復它?

為什麼我不能將唯一指標「push_back」放入向量中,如何修復它?

Susan Sarandon
發布: 2024-12-22 14:12:10
原創
173 人瀏覽過

Why Can't I `push_back` Unique Pointers into a Vector, and How Do I Fix It?

唯一指標向量:為什麼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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板