2
int length = 5;
int hi[length];

vs

int length = 5;
int *hi = new int[length];

サイズが一定ではない配列を静的に割り当てようとすると、コンパイラがCで文句を言うように教えられました。したがって、サイズが不明な配列が必要になった場合は、メモリを動的に割り当てる必要がありました。しかし、最初の例を許可するコンパイラーができたので、それらは正確に何をしているのでしょうか?彼らはまだデータセグメントに参加していますか、それともヒープに参加していませんか?それらがヒープ上にある場合、例の違いは何ですか。また、最初の例ではなく、2番目の例でdelete []を呼び出す必要があるのはなぜですか?

4

2 に答える 2

2

しかし、最初の例を許可するコンパイラーができたので、それらは正確に何をしているのでしょうか?彼らはまだデータセグメントに参加していますか、それともヒープに参加していませんか?それらがヒープ上にある場合、例の違いは何ですか。また、最初の例ではなく、2番目の例でdelete []を呼び出す必要があるのはなぜですか?

1つ目は、静的変数(通常はスタック*上)を宣言することです。この変数は、それが定義されているコードブロックの最後で停止します

2つ目は、変数(通常はヒープ*上)を動的に割り当てることです。これは、変数の割り当てを解除する場所を決定できるのはdelete[]あなたです(もちろん、忘れずに行う必要があります)。

配列のコンテキストでの2つの主な違いは、2番目の配列は、それが指すメモリ(たとえば、前の配列)の割り当てを解除し、動的に割り当てられた新しい配列を指すようにすることで、簡単にサイズを変更できることです。

int* arr = new int[5];
[...]
delete[] arr;
arr = new int[10];

静的配列は通常、代わりに変更してはならないをint hi[length]宣言します。const int*つまり、C ++は、配列の代わりに使用できる/使用すべきコンテナの完全なセットを提供します。

[*]注:C ++標準では、動的メモリまたは静的メモリを割り当てる場所は指定されていません。

于 2013-03-27T04:02:08.383 に答える
0

おそらくあなたのコード

int length = 5;
int hi[length];

後者は合法ではないため、ファイルスコープではなくローカルスコープにあります。

彼らはまだデータセグメントに進んでいますか

彼らはデータセグメントに入ることがありませんでした。それらはスタックに置かれます(典型的/一般的な実装では、言語標準はそれらがどこに行くかを示していません)。

2番目の例でdelete[]を呼び出す必要があるのに、1番目の例では呼び出さないのはなぜですか?

まず、VLA(のような可変長配列hi[length])はC ++では有効ではないため、delete[]を呼び出すことはできません。ただし、ブロックの最後でスコープ外になるため、deleteを呼び出す必要はありません。OTOHhiによって割り当てられたオブジェクトまたは配列は、削除されるまでスコープ外になりません。newポインタ、、のみhiがスコープ外になりますが、まだスコープ内にある別のポインタにその値を割り当てている可能性があります。

于 2013-03-27T04:01:18.690 に答える