2012-08-08 11 views
7

Powiel możliwe:
When and why will an OS initialise memory to 0xCD, 0xDD, etc. on malloc/free/new/delete?Dlaczego nie przydzielona pamięć jest oznaczona jako 0xCC?

Dlaczego pamięć mam Niezainicjowany ustawiony 0xCC?

Ustawienie pamięci na 0xCC spowoduje zmniejszenie wydajności, więc musi istnieć powód do zapełnienia pamięci tym bajtem.

+0

Ostateczna odpowiedź na to tutaj na SO: http://stackoverflow.com/questions/370195/when-and-why-will-an-os-initialise-memory-to-0xcd-0xdd-etc-on- malloc-free-new –

Odpowiedz

14

Inside CRT: Debug Heap Management

Podczas kompilacji build debugowania programu Visual Studio i go uruchomić debugger, można zobaczyć, że pamięć przydzielona lub dealokowane ma wartości śmieszne, takie jak ...

0xCC Gdy kod jest skompilowany z opcją/GZ, niezainicjowane zmienne są automatycznie przypisywane do tej wartości (na poziomie bajtów).

Magic Number on Wiki:

cccccccc używany przez Microsoft C++ debugowania biblioteki wykonania oznaczyć zainicjalizowana pamięć stosu

w Visual Studio CRT Źródła, \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

Gdy kod jest skompilowany z opcją/GZ, niezainicjowane zmienne są automatycznie przypisywane do tej wartości (na poziomie bajtów).

0xCC jest instrukcją kodu maszynowego do wywoływania punktu przerwania. Więcej informacji: see another question.

5

Kompilator robi to za Ciebie w trybie debugowania, więc jeśli przypadkowo odczytasz niezainicjowaną pamięć, zobaczysz charakterystyczną wartość 0xCC i rozpoznasz, że (prawdopodobnie) czytasz niezainicjowaną pamięć. Wartość 0xCC ma wiele innych użytecznych właściwości, na przykład jest to instrukcja języka maszynowego do wywoływania punktu przerwania sprzętowego w razie przypadkowego uruchomienia niezainicjowanej pamięci.

Podstawowa zasada: ułatwi identyfikację wartości pochodzących z odczytu niezainicjowanej pamięci.

Tak się nie dzieje w twoich wersjach wydania.

Ta technika została wprowadzona w Writing Solid Code.

Powiązane problemy