ホームページ >バックエンド開発 >C++ >一意のポインタをベクトルに直接プッシュできないのはなぜですか?

一意のポインタをベクトルに直接プッシュできないのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-25 02:15:13810ブラウズ

Why Can't I Directly Push Unique Pointers into Vectors?

一意のポインターをベクターにプッシュする際の問題

プログラマーは、ベクター内で一意のポインターを操作しようとすると、困難に遭遇する可能性があります。この記事は、この問題が発生する理由を説明し、解決策を提供することを目的としています。

次のコード スニペットを考えてみましょう:

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。