エラーの理解
次のプログラムについて考えてみましょう:
#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_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 を作成し、オブジェクトを 1 行で割り当てることもできます:
#include <memory> #include <vector> int main() { std::vector<std::unique_ptr<int>> vec; vec.push_back(std::make_unique<int>(1)); }
以上が「unique_ptr」を「vector」にプッシュするには「std::move」が必要なのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。