ホームページ > バックエンド開発 > C++ > 一意のポインタをベクトルに「プッシュバック」できない理由とその修正方法

一意のポインタをベクトルに「プッシュバック」できない理由とその修正方法

Susan Sarandon
リリース: 2024-12-22 14:12:10
オリジナル
173 人が閲覧しました

Why Can't I `push_back` Unique Pointers into a Vector, and How Do I Fix It?

一意のポインタのベクトル: Push_back が拒否される理由とその克服方法

C では、一意のポインタを格納しようとすると障害が発生しますベクトル内のポインター。ベクター コンテナはコピーを許可する要素を期待しますが、一意のポインタは一意の所有権の原則に厳密に準拠します。

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

std::vector<std::unique_ptr<int>> vec;

int x(1);
std::unique_ptr<int> ptr2x(&x);
vec.push_back(ptr2x); // Compiler error: attempt to copy unique pointer
ログイン後にコピー

このエラーは、排他性を確保するための unique_ptr の設計に起因します。所有。 unique_ptr をコピーすると、この基本的なプロパティに違反し、その中心的な目的が損なわれます。

ジレンマを解決するための移動

この問題を解決するには、「move」操作を利用する必要があります。コピーするのではなく。移動操作は、あるコンテナーから別のコンテナーに所有権を移し、重複がないようにします。

vec.push_back(std::move(ptr2x));
ログイン後にコピー

この変更により、コードは unique_ptr をベクターに正常に挿入し、排他的所有権を維持します。

注意事項

ポインターを管理するために unique_ptr を使用することに注意することが重要です。 「x」のようなローカル変数は推奨されません。ローカル変数は、ブロック終了時に自動的に処理されます (たとえば、この場合は関数が返される)。代わりに、オブジェクトを動的に割り当てる必要があります。

std::unique_ptr<int> ptr(new int(1));
ログイン後にコピー

C 14 では、make_unique:

std::make_unique<int>(5);
ログイン後にコピー
を使用してこれをさらに簡素化できます。

以上が一意のポインタをベクトルに「プッシュバック」できない理由とその修正方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート