>①
C/C++の規格としては初期化されていないメモリはどのような値になっているかは決められていません。
ただし、VisualC++の場合はメモリリークやバッファーオーバラン検出などのために割り当てメモリの前後に特定のパターンの値で埋めていることもあります。
旧MSDNフォーラムが消滅したのでバックアップから引用
gekka wrote;
バッファーオーバーランによる書き換えを検出するための特定パターンを埋め込んでおくための領域では? 後ろに付加されるのはリリースビルドでは発生しない現象だったりしませんか?領域の前方にも同じようなパターンがありませんか?
デバッグビルドではデバッグ用のmallocで領域確保するようですよ。 CRT デバッグ ヒープ
Atomu Hidakaさんwrote;
どこかでパターンによって意味があると見たことがあります。調べてみました。
これのことでしょうか?
ポインタ先の変数のダンプが、0xFDFDFDFD ならば、ポインタ計算の誤りです。 ポインタ先の変数のダンプが、0xDDDDDDDD ならば、メモリ開放して無効になった変数へのアクセスです。 変数のダンプが、0xCDCDCDCD または 0xCCCCCCCC ならば、変数の初期化忘れです。 https://qiita.com/hkuno/items/ed32c0597233e401dc3c
>②③
検索してみつけたstackoverflowのリンクを見ると、コンパイラの隠しオプション-initallや、MicrosoftのBlogなどが見つかります。
ブログのInitAll - Automatic Initializationには、コンパイラのバージョンに言及はしていませんが、現在はコンパイル時にスタック領域を初期化していると書かれてます。
ほかにもWin101903以降はOSレベルで対応しているようなことも書かれていますね。
再利用されたメモリに前のデータが残っているとセキュリティの問題もあったりするので、この記事以外でもゼロに初期化されてるようになっていることもあるかもしれません。