プログラマーは、ベクター内で一意のポインターを操作しようとすると、困難に遭遇する可能性があります。この記事は、この問題が発生する理由を説明し、解決策を提供することを目的としています。
次のコード スニペットを考えてみましょう:
std::vector<std::unique_ptr<int>> vec; int x(1); std::unique_ptr<int> ptr2x(&x); vec.push_back(ptr2x); // Error: Can't copy a unique_ptr
このコードは、一意のポインターの基本原理によりエラーを生成します。一意のポインターにより、単一のコンテナーのみが管理対象ポインターを制御することが保証されます。したがって、同じオブジェクトへの複数の一意のポインターをコピーまたは作成することは禁止されています。
この問題を解決するには、ポインターの所有権をある一意のポインターから別のポインターに転送する移動コンストラクターを使用する必要があります。修正されたコードは次のとおりです。
vec.push_back(std::move(ptr2x));
提供された例の x など、ローカル変数へのポインターを管理するために一意のポインターを使用するのは間違っていることに注意することが重要です。ローカル変数は自動的に管理され、その有効期間は、それを含むブロックが完了すると終了します。代わりに、オブジェクトを動的に割り当てます:
std::unique_ptr<int> ptr(new int(1));
C 14 では、make_unique:
make_unique<int>(5);を使用してこれをさらに簡素化できます。
以上が一意のポインタをベクトルに直接プッシュできないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。