理解錯誤
考慮以下程序:
#include <memory> #include <vector> int main() { std::vector<std::unique_ptr<int>> vec; int x(1); std::unique_ptr<int> ptr2x(&x); vec.push_back(ptr2x); // Error occurs here }
這段看似無害的程式碼嘗試推送unique_ptr變成一個向量。但是,編譯失敗並出現錯誤:
error: deleted function 'std::unique_ptr<int>::unique_ptr(const std::unique_ptr<int>&)'
unique_ptr 的本質
unique_ptr 是C 標準庫的基本部分,用於管理動態分配物件的生命週期。它確保它封裝的指標不能被複製。這意味著託管物件的所有權是 unique_ptr 容器獨佔的。問題
出現錯誤是因為程式嘗試將 unique_ptr 的副本推送到向量。然而,如前所述,unique_ptrs 不能被複製。相反,它們只能被移動。解決方案
因此,要解決這個問題,我們需要使用 std::move 函數來轉移 unique_ptr 的所有權從原始變數到向量。修正後的程式碼應如下所示:#include <memory> #include <vector> int main() { std::vector<std::unique_ptr<int>> vec; int x(1); std::unique_ptr<int> ptr2x(&x); vec.push_back(std::move(ptr2x)); // Use std::move to transfer ownership }現在,編譯器將能夠成功編譯並執行程序,不會出現任何錯誤。
其他注意事項
需要注意的是,程式碼中unique_ptr的使用是不正確的。 unique_ptr 旨在管理動態分配的物件。程式碼中的指標指向一個局部變量,該變數將在函數返回時被銷毀。要解決此問題,程式碼應動態分配物件:#include <memory> #include <vector> int main() { std::vector<std::unique_ptr<int>> vec; std::unique_ptr<int> ptr(new int(1)); // Dynamically allocate the object vec.push_back(std::move(ptr)); }或者,您可以使用 std::make_unique 函數建立 unique_ptr 並在一行中指派物件:
以上是為什麼將`unique_ptr`推入`vector`需要`std::move`?的詳細內容。更多資訊請關注PHP中文網其他相關文章!