9

私はこのようなコードを書いています:

while(true) {
    int array[5];
    // do something
}

ループの各ターンで、配列は新しい配列になります。ループの最後でアレイを削除する必要がありますか?

4

4 に答える 4

16

ループの終わりに配列を削除する必要がありますか?

いいえarray、自動保存期間があるため、削除する必要はありません。各whileループから抜けると解放されます。

delete [] / new []delete / newをペアで呼び出す必要があります。

于 2013-02-15T05:26:08.137 に答える
1

いいえ。

スタックで宣言された変数は、手動で割り当てを解除する必要はありません。配列のスコープはwhileループ内です。ループが繰り返されるたびに、配列はスタックに割り当てられ、自動的に割り当てが解除されます。

で宣言された配列のみをnew[]手動で割り当て解除する必要がありますdelete[]

また、宣言する配列はstaticいかなる意味でもありません。キーワードはCで特定のstatic意味を持ちます。宣言した配列は、実際にはauto(自動ストレージ)変数として格納されます。つまり、スコープ外になると自動的に割り当てが解除されます。

于 2013-02-15T05:24:29.303 に答える
1

他の回答では、配列がスタック上にあるため a は不要であると正しく説明されていdeleteますが、スタックが何であるかは説明されていません。ここに非常に優れた説明があります:スタックとヒープとは何ですか?

あなたの質問に当てはまるように、C および C++ では、コンパイラに別の方法で明示的に指示しない限り、変数はスタックに配置されます。つまり、変数は宣言されているスコープ (つまり、ブロック) 内にのみ存在します。ヒープに何かを置くようにコンパイラーに明示的に指示する方法は、malloc(C の方法) またはnew(C++ の方法) のいずれかです。freeその場合にのみ、( C の場合) またはdelete/ delete[](C++)を呼び出す必要があります。

于 2013-02-15T05:31:31.767 に答える
0

スタックに割り当てられた配列またはオブジェクトを削除することはできません (複雑なアセンブリを使用しない限り)。

何らかの理由で、作成したアレイを削除する必要がある場合:

int *array = new int[5];
//do something
delete[] array;

std::vectorまた、配列の代わりに使用することをお勧めします。

于 2013-02-15T05:26:58.047 に答える