4
int* array = new int[ 10 ]( );

これは new 演算子の適切な使用法ですか? 私の知る限り、前のコードは配列内の各要素を 0 に初期化します。

int* array = new int[ 10 ];

コードの 2 行目は配列を初期化するだけで、値を 0 に設定していませんか?

4

1 に答える 1

2

new 演算子を適切に使用する方法は、メモリを割り当てた後に次に何をするかによって異なります。

int* array = new int[10](); 配列内の各intに対してint初期化子を実行しているため、割り当てているメモリをゼロにします。

int* array = new int[10]; はメモリを初期化しないため、配列内の各 int の値は、取得したメモリ アドレスの値と同じになりnewます。運が良ければゼロかもしれませんが、おそらく他のメモリ要求/解放からそこに残されたガベージです。

一般的に言えば、初期化されていない変数はガベージ値として扱い、値を割り当てる前に使用しないようにする必要があります。これは、乱数ジェネレーターでエントロピーとして使用している場合を除きますが、それでもメモリがクリーンすぎると十分にランダムにならない可能性があります。別のまれな使用例として、別のプログラムが閉じた後にメモリに残っているものをスヌーピングすることがあります。これらの例は両方とも、ルールの例外です。

通常、初期化しない一番の理由は速度です。配列内の各項目を 0 に設定すると、速度が低下します。小さいかもしれませんが、配列が巨大であるか、このコードを頻繁に実行する場合は、それが顕著になる可能性があります。これは、使用する前にこれらの値を設定することがわかっている場合に使用します。不必要に初期化するコストを節約できます。

std::vector<int>以上のことをすべて述べたので、メモリリークを心配する必要がないという利点以外に何もない場合、通常はより良い方法であるコメントにも同意します(これには多くのデバッグ/開発時間がかかる可能性があります)過小評価してはいけません)そして、多くのメリットも得られます。言うまでもなく、通常の配列と同じことをベクトルでもすべて実行できます。これは、ベクトルが連続したメモリを割り当てるためです。

std::vector<int> safeArray(10);
int* array = &safeArray[0]; // array now points to the 0th element in safeArray

std::vector で失われることの 1 つは、初期化するかどうかを選択できなくなることです。

于 2014-01-30T08:15:49.437 に答える