2012-08-08 21 views
7

Duplicar posible:
When and why will an OS initialise memory to 0xCD, 0xDD, etc. on malloc/free/new/delete?¿Por qué la memoria no asignada está marcada como 0xCC?

¿Por qué es la memoria no he inicializado a establecer 0xCC?

Al configurar la memoria en 0xCC disminuirá el rendimiento, por lo que debe haber un motivo para llenar la memoria con este byte.

+0

La respuesta definitiva al respecto aquí en SO: http://stackoverflow.com/questions/370195/when-and-why-will-an-os-initialise-memory-to-0xcd-0xdd-etc-on- malloc-libre-nuevo –

Respuesta

14

Inside CRT: Debug Heap Management

Al compilar una versión de depuración de su programa con Visual Studio y ejecuta en el depurador, se puede ver que la memoria asignada o desasignado tiene valores divertidas, tales como ...

0xCC Cuando el código se compila con la opción/GZ, las variables sin inicializar se asignan automáticamente a este valor (en el nivel de byte).

Magic Number on Wiki:

CCCCCCCC Utilizado por C++ de Microsoft depuración de la biblioteca de tiempo de ejecución para marcar sin inicializar memoria de pila

En Visual Studio CRT Fuente, \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)) 
2

Cuando el código se compila con la opción/GZ, las variables no inicializadas se asignan automáticamente a este valor (en el nivel de byte).

0xCC es una instrucción de código de máquina para invocar el punto de interrupción. Para más información see another question.

5

El compilador hace esto por usted en modo de depuración, de modo que si accidentalmente lee la memoria no inicializada, verá el valor 0xCC distintivo, y reconocerá que (probablemente) lea la memoria no inicializada. El valor de 0xCC tiene muchas otras propiedades útiles, por ejemplo, es la instrucción de lenguaje de máquina para invocar un punto de corte de hardware si accidentalmente ejecuta alguna memoria no inicializada.

El principio básico: hace que sea fácil identificar los valores que provienen de la lectura de la memoria no inicializada.

Esto no ocurre en las versiones de lanzamiento.

Esta técnica se introdujo en Writing Solid Code.

Cuestiones relacionadas