ホームページ > バックエンド開発 > C++ > C の「new」はメモリをゼロに初期化しますか?

C の「new」はメモリをゼロに初期化しますか?

Linda Hamilton
リリース: 2024-12-11 06:53:09
オリジナル
654 人が閲覧しました

Does `new` in C   Initialize Memory to Zero?

演算子 new メモリをゼロに初期化します

C では、 new 演算子は動的メモリ割り当てによく使用されます。指定されたサイズのメモリ ブロックを割り当て、割り当てられたメモリへのポインタを返します。ただし、new は割り当てられたメモリをゼロで初期化しないというよくある誤解があります。この記事では、new がメモリを初期化する方法を明確にし、明らかな矛盾に対処します。

デフォルトとゼロ初期化

new を使用してプリミティブ型 (例: int) のオブジェクトを作成する場合、unsigned int)、2 つあります。バリエーション:

  • wsk = new unsigned int; - デフォルトの初期化: 初期化は実行されず、メモリは初期化されないままになります。
  • wsk = new unsigned int(); - ゼロ初期化: メモリはゼロに設定されます。

同じことが配列にも当てはまります:

  • wsa = new unsigned int[5]; - デフォルトの初期化
  • wsa = new unsigned int[5](); - ゼロ初期化

ゼロ初期化の明確化

new は通常、プリミティブを不定の値で初期化しますが、空の括弧構文 (new) でゼロ初期化を使用すると例外が発生します。タイプ();)。これにより、メモリがゼロで初期化されます。 C 11 標準では、次の動作がサポートされています。

[C++11: 5.3.4/15]: A new-expression that creates an object of type T initializes that object as follows: [...] If the new-initializer is interpreted according to the initialization rules of 8.5 for direct-initialization.
ログイン後にコピー

Placement New

Placement New を使用すると、特定の場所にメモリを割り当てることができます。ゼロ初期化でこの手法を利用すると、メモリが実際にゼロに設定されていることが明らかになります。

//... (memory allocation and initialization code)
wsa[0] = 1;  // Modify the memory location
wsa[1] = 2;  // Modify the memory location
// ... (more modifications)
//...
ログイン後にコピー

メモリに元の値 (1、2、...) が含まれている場合、ゼロ初期化は次のようになります。失敗した。ただし、出力は、割り当てられたメモリがゼロに設定されていることを確認します。

したがって、通常、new はプリミティブ メモリをゼロで初期化しませんが、ゼロ初期化 (new type();) を使用するとメモリがゼロに初期化されます。これは、直接メモリ割り当てと新規配置の両方に当てはまります。

以上がC の「new」はメモリをゼロに初期化しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート