0

ここで多くのトピックを検索しましたが、正確に答えてくれなかったようです。

C++ で配列の動的な再割り当てを行おうとしています。STL(ベクトルなど)が明示的に禁止されている宿題でこれを使用する必要があるため、STLライブラリからは何も使用できません。

これまでのところ、次のようなコードで詳しく説明しようとしました。

int * items = new int[3]; //my original array I'm about to resize
int * temp = new int[10];
for (int i = 0; i < 3; i++) temp[i] = items[i];

delete [] items;   //is this necessary to delete?
items = new int [10];
for (int i = 0; i < 10; i++) items[i] = temp[i];
delete [] temp;

これは機能しているように見えますが、私が気になるのは反復回数が多すぎることです。これをもっと賢くすることはできませんか?明らかに、私はこれよりもはるかに大きな配列で作業しています。残念ながら、私配列を扱う必要があります。

編集:items = temp;代わりにやろうとすると

for (int i = 0; i < 10; i++) items[i] = temp[i];すべての要素を試してみるとstd::cout、最初の 2 つの要素が失われますが、valgrindはそれらを正しく出力します。

4

2 に答える 2

5

はい、最初delete[]は必要です。それがないと、メモリリークが発生します。

first の後に続くコードに関してはdelete[]、すべてを次のように置き換えることができます。

items = temp;

これは、items入力した 10 要素の配列を示します。

int * items = new int[3]; //my original array I'm about to resize
int * temp = new int[10];
for (int i = 0; i < 3; i++) temp[i] = items[i];
delete [] items;   //delete the original array before overwriting the pointer
items = temp;

delete[] items;最後に、配列を使い終わったら忘れないでください。

于 2013-03-27T11:28:43.047 に答える
0

のコンテナは、STLこのような作業を容易にするために作られました。C面倒ですが、 -arraysを使用する必要がある場合、選択肢はあまりありません。

の削除

delete [] items; 

配列への参照を放棄するときのように、必要です。これは、新しい参照を割り当てることで行います

items = new int [10];

メモリリークが発生するため、これが必要です。

于 2013-03-27T11:30:28.467 に答える