8

初期化していないメモリが に設定されているのはなぜ0xCCですか?

メモリを に設定する0xCCとパフォーマンスが低下するため、メモリをこのバイトで埋める理由が必要です。

4

3 に答える 3

14

CRTの内部:ヒープ管理のデバッグ

Visual Studioを使用してプログラムのデバッグビルドをコンパイルし、デバッガーで実行すると、割り当てられたメモリまたは割り当て解除されたメモリに次のようなおかしな値が含まれていることがわかります。

0xCCコードが/GZオプションを使用してコンパイルされると、初期化されていない変数がこの値に自動的に割り当てられます(バイトレベルで)。

Wikiのマジックナンバー

CCCCCCCCMicrosoftのC++デバッグランタイムライブラリが初期化されていないスタックメモリをマークするために使用します

Visual Studio CRTソースでは、\VC\crt\src\malloc.h

#define _ALLOCA_S_STACK_MARKER  0xCCCC

// ...

#undef _malloca
#define _malloca(size) \
__pragma(warning(suppress: 6255)) \
    ((((size) + _ALLOCA_S_MARKER_SIZE) <= _ALLOCA_S_THRESHOLD) ? \
        _MarkAllocaS(_alloca((size) + _ALLOCA_S_MARKER_SIZE), _ALLOCA_S_STACK_MARKER) : \
        _MarkAllocaS(malloc((size) + _ALLOCA_S_MARKER_SIZE), _ALLOCA_S_HEAP_MARKER))
于 2012-08-08T12:47:50.050 に答える
5

コンパイラはデバッグモードでこれを実行するため、初期化されていないメモリを誤って読み取った場合、特徴的な0xCC値が表示され、(おそらく)初期化されていないメモリを読み取ったことが認識されます。0xCC値には、他にも多くの便利なプロパティがあります。たとえば、初期化されていないメモリを誤って実行した場合にソフトウェアブレークポイントを呼び出すための機械語命令です。

基本原則:初期化されていないメモリの読み取りから生じる値を簡単に識別できるようにします。

これは、リリースビルドでは発生しません。

この手法は、SolidCodeの記述で導入されました。

于 2012-08-08T13:06:17.807 に答える
2

/GZ オプションを使用してコードをコンパイルすると、初期化されていない変数がこの値に (バイト レベルで) 自動的に割り当てられます。

0xCC は、ブレーク ポイントを呼び出すマシン コード命令です。詳細については、別の質問を参照してください

于 2012-08-08T12:52:41.497 に答える