質問

私は授業用のシミュレーションを書いているのですが、その一部には生物の繁殖が含まれています。私の生物はアレイ内に保管されており、繁殖する際にはアレイのサイズを増やす必要があります。複数の生物に対して複数のクラスがあるため、テンプレートを使用しました。

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 がこれを実行します

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top