演算子の New とメモリの初期化
new 演算子は、初期化せずにメモリを割り当てることが一般的に知られています。ただし、最近のコード例では、new を使用した割り当て時にメモリがゼロに初期化されるように見えるシナリオが明らかになりました。これにより、オペレーターの実際の動作について疑問が生じます。
コード:
#include <iostream> int main() { unsigned int *wsk2 = new unsigned int(5); std::cout << "wsk2: " << wsk2 << " " << *wsk2 << std::endl; delete wsk2; wsk2 = new unsigned int; std::cout << "wsk2: " << wsk2 << " " << *wsk2 << std::endl; return 0; }
出力:
wsk2: 0x928e008 5 wsk2: 0x928e008 0
値への wsk2 の最初の割り当てと初期化5は期待どおりに動作します。ただし、初期化子を使用しない新しい unsigned int への wsk2 の 2 回目の割り当てと割り当ての結果は、値 0 になります。
さらに調査すると、新しい演算子には 2 つのバージョンがあることが明らかになります。
この動作は配列にも適用されます:
placement new を使用したカスタム テストにより、ゼロ初期化が実際に行われることが確認されます:
#include <new> #include <iostream> int main() { unsigned int wsa[5] = {1, 2, 3, 4, 5}; unsigned int *wsp = new(wsa) unsigned int[5](); std::cout << wsa[0] << "\n"; // If these are zero then it worked as described. std::cout << wsa[1] << "\n"; // If they contain the numbers 1 - 5 then it failed. std::cout << wsa[2] << "\n"; std::cout << wsa[3] << "\n"; std::cout << wsa[4] << "\n"; }
出力:
0 0 0 0 0
これは、メモリを残すという一般的な誤解にもかかわらず、新しい演算子が括弧と一緒に使用された場合にゼロ初期化をサポートしていることを示しています初期化されていません。
以上が「新しい」オペレータはいつメモリをゼロに初期化しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。