首頁 >後端開發 >C++ >為什麼將`unique_ptr`推入`vector`需要`std::move`?

為什麼將`unique_ptr`推入`vector`需要`std::move`?

DDD
DDD原創
2025-01-04 19:28:44742瀏覽

Why does pushing a `unique_ptr` into a `vector` require `std::move`?

理解錯誤

考慮以下程序:

#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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn