2

私はクラスのシミュレーションを書いていますが、その一部には生物の繁殖が含まれています。私の有機体はアレイに保持されており、繁殖するときにアレイのサイズを大きくする必要があります。複数の生物に対して複数のクラスがあるため、次のテンプレートを使用しました。

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 関数の実行中にプログラムがクラッシュすることはありませんが、後でアクセス違反が発生するとクラッシュします。

配列を拡張する関数を何百回も書いてきましたが、今回は何を失敗したのかわかりません。私の機能に明らかに間違っていることがありますか?それはあなたに正しく見えますか?

編集:みんなの助けに感謝します。こんなに明白なことを見逃したなんて信じられない。using std::vector: については、まだクラスで説明していません。ばかげているように見えますが、教えられたメソッドを使用してコードを記述する必要があります。

4

3 に答える 3

9

oldarrayを参照として渡す必要があります:orgType *& oldarray。現在の記述方法では、関数は呼び出し元の配列を削除しますが、新しく割り当てられた配列を提供しないため、クラッシュが発生します。

std::vectorさらに良いことに、それを再実装する代わりに使用してください。

于 2010-04-11T20:15:05.503 に答える
3

C ++標準ライブラリには、これを行うために作成された機能がすでに含まれています。

std::vectorコンテナを使用してください。

于 2010-04-11T20:15:27.127 に答える
0

新しい配列を指すようにポインタoldarrayを変更しているように見えますが、関数では単なるコピーであり、渡した変数には影響しないことを覚えておいてください。必要に応じて、ポインタへの参照を渡す必要があります。このように。

そして確かに、std::vectorはとにかくあなたのためにこれを行います

于 2010-04-11T20:15:45.950 に答える