C++ で配列を拡張する際の問題
質問
私は授業用のシミュレーションを書いているのですが、その一部には生物の繁殖が含まれています。私の生物はアレイ内に保管されており、繁殖する際にはアレイのサイズを増やす必要があります。複数の生物に対して複数のクラスがあるため、テンプレートを使用しました。
template <class orgType>
void expandarray(orgType* oldarray, int& numitems, int reproductioncount)
{
orgType *newarray = new orgType[numitems+reproductioncount];
for (int i=0; i<numitems; i++) {
newarray[i] = oldarray[i];
}
numitems += reproductioncount;
delete[] oldarray;
oldarray = newarray;
newarray = NULL;
}
しかし、このテンプレートは何らかの理由でデータを破損しているようです。再現しなくても (expandarray への呼び出しをコメントアウトして) プログラムを正常に実行できますが、この関数を呼び出すとプログラムがクラッシュします。プログラムは、expandarray 関数の実行中はクラッシュしませんが、その後アクセス違反が発生するとクラッシュします。
私は配列を展開する関数を何百回も書いてきましたが、今回は何を間違えたのか全く分かりません。私の機能に何か明らかに間違った点があるのでしょうか?あなたにはそれが正しく見えますか?
編集: 皆さんのご協力に感謝します。こんな当たり前のことを見逃していたなんて信じられない。使用に応じて std::vector
:まだクラスで話し合っていませんし、ばかばかしいように思えるかもしれませんが、教えられた方法を使ってコードを書く必要があります。
解決
oldarray を参照として渡す必要があります。 orgType *& oldarray
. 。現在の書き方では、関数は呼び出し元の配列を削除しますが、新しく割り当てられた配列を与えないため、クラッシュが発生します。
さらに良いことに、 std::vector
それを再実装する代わりに。
他のヒント
C++ 標準ライブラリには、これを行うために作成された機能がすでに含まれています。
使用 std::vector
容器。
新しい配列を指すようにポインター oldarray を変更しているように見えますが、関数内ではこれは単なるコピーであり、渡した変数には影響しないことに注意してください。この方法で実行したい場合は、おそらくポインタへの参照を渡す必要があります。
そして確かに、とにかく std::vector がこれを実行します