配列内の特定のクラス オブジェクトに対して削除を使用して、配列全体ではなくそのオブジェクトのみを削除するにはどうすればよいですか?
このオブジェクトは配列の最後にあるものに関係ないため、配列内の他のオブジェクトを移動しても問題ありません
編集:
より明確にするために、後で使用するために配列の最後の要素を解放したいだけです。
配列内の特定のクラス オブジェクトに対して削除を使用して、配列全体ではなくそのオブジェクトのみを削除するにはどうすればよいですか?
このオブジェクトは配列の最後にあるものに関係ないため、配列内の他のオブジェクトを移動しても問題ありません
編集:
より明確にするために、後で使用するために配列の最後の要素を解放したいだけです。
std::vector
これを行う必要がある場合は、通常の配列の代わりに使用する必要があります。ではstd::vector
、最後の要素の削除と破棄はpop_back
メソッドを介して行われます。
絶対に通常の配列を使用する必要があり、配列内の 1 つのオブジェクトを今すぐ破棄する必要がある場合は、そのオブジェクトを配置破棄してから、その場所に新しいオブジェクトを構築できます。これが何を意味するのか、またはどのように行うのかがわからない場合は、std::vector
代わりに使用する必要があります。
ディレクティブで割り当てられた配列は、new[]
ディレクティブでのみ解放できますdelete[]
。配列の一部または全体 ( など) を解放しようとするその他の試みはfree
、delete
未定義の動作です。配列内の特定の要素を解放できるようにしたい場合はstd::vector
、std::list
、std::set
、std::map
などの stl コンテナの使用を検討することをお勧めします。それぞれに異なるプロパティがあり、異なるタスクに適していますが、すべてが高速削除をサポートしています要素(vector
最後の要素の「高速」な削除のみをサポートする場合を除きますが、それはまさにあなたが望んでいたものであるため、適切なオプションです)、実際には要素の割り当てを「非表示」にします。
配列の最後の要素を別の場所にコピーしたい場合は、単純にそれを行い、最後の要素を無視します。削除することはできません。通常、現在配列内にある要素の量を保持するカウンター変数がどこかにあります。したがって、最後の要素を「削除」するときは、そのカウンターを 1 減らすだけです。
参考までに、std::vector
まったく同じように機能します。(そしてstd::vector
、とにかく最初から使用する必要があります。)
配列が次のような場合
object* array = new object[n];
その後、その要素を削除することはできません。を使用して要素を移動できますがmemcpy()
、配列のサイズは変更できません。
new
配列項目に対してorを使用delete
すると、ほとんどの場合、ヒープが破損します。提案されているように、使用する必要がありますstd::vector
。
配列がオブジェクトへのポインターの配列である場合、ポイントされたオブジェクトをdelete
削除できますが、ポインター自体を削除することはできません (この回答の最初の部分を参照)。
編集:質問の作成者からのコメントは、ポインター配列の最後の要素を削除したいことを指定しています。
最後のポインターを 0 に設定して、以下を確認できます。
pointers[size - 1] = 0;
// later, when using the array
if(pointers[i]) // do smth
使い方std::vector
がより簡単になります。また、削除が頻繁に行われる場合は、 の使用を検討する必要がありますstd::list
。