C での所有権の移動とコンテナーの再利用
C では、オブジェクトが (std::move 関数を使用して) 移動されると、その所有権は新しい変数に転送されます。これは、元の変数が空になり、有効なデータが含まれていないことを意味します。
移動されたコンテナを操作するときに生じる一般的な質問の 1 つは、コンテナを再利用する方法です。 「移動されたコンテナを再利用する正しい方法は何ですか?」
「有効だが指定されていない状態」について
C 0x 標準ドラフトによると、次のような疑問が生じます。 、移動後のオブジェクトは「有効だが未指定の状態」になります。これは、オブジェクトがその不変条件を満たしているが、その内部状態が一貫していることは保証されていないことを意味します。
オプション 1: 何もしない
1 つのオプションは、何もしないことです。オブジェクトがまだ有効であると仮定します。ただし、コンテナの内部状態が一貫していない場合、未定義の動作が発生する可能性があるため、このアプローチは推奨されません。
オプション 2: クリアによる "リセット"
Anotherオプションは、clear メソッドを使用してコンテナを「リセット」し、空にすることです。このアプローチにより、コンテナの内部状態の一貫性が確保され、コンテナを安全に再利用できるようになります。
オプション 3: デフォルト コンストラクタを使用して再初期化する
最後のオプションは、単にコンテナを再初期化することです。コンテナはデフォルトのコンストラクターを使用します。また、このアプローチにより、コンテナーの内部状態の一貫性が確保され、再度使用できるようになります。
推奨されるアプローチ
移動されたコンテナーを再利用するための推奨されるアプローチは、clear メソッドを使用することです。 。このアプローチは安全かつ効率的であり、他のオプションに関連する潜在的な落とし穴を回避します。
例
次のコードを考えてみましょう:
std::vector<int> container; container.push_back(1); auto container2 = std::move(container); //container2.clear(); Reset container = std::vector<int>(); // Reinitialize container.push_back(2); assert(container.size() == 1 && container.front() == 2);
clear メソッドを使用してコンテナ 2 をリセットすることで、コンテナ 2 の内部状態が一貫しており、安全に再利用できることが保証されます。その結果、後続の Push_back 操作により、新しい要素がコンテナに正しく追加されます。
以上が移動したコンテナを C で安全に再利用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。