2012-08-08 3 views
7

Mögliche Duplizieren:
When and why will an OS initialise memory to 0xCD, 0xDD, etc. on malloc/free/new/delete?Warum wird der nicht zugewiesene Speicher wie 0xCC markiert?

Warum ich habe ist der Speicher nicht auf 0xCC gesetzt initialisiert?

Einstellen des Speichers 0xCC wird die Leistung verringern, so muss es mit diesem Byte ein Grund zum Füllen des Speichers sein.

+0

Die definitive Antwort hier auf SO: http://StackOverflow.com/Questions/370195/when-and-why-will-an-os-initiitis-Memory-to-0xcd-0xdd-etc-on-c- malloc-frei-neu –

Antwort

14

Inside CRT: Debug Heap Management

Wenn Sie ein Debug-Build des Programms mit Visual Studio und laufen sie in Debugger kompilieren, können Sie sehen, dass der Speicher zugewiesen oder deallokierten lustige Werte hat, wie ...

0xCC Wenn der Code mit der Option/GZ kompiliert wird, werden diesem Wert (auf Byte-Ebene) automatisch nicht initialisierte Variablen zugewiesen.

Magic Number on Wiki:

CCCCCCCC Verwendet von Microsoft C++ Laufzeitbibliothek Debugging uninitialised Stapelspeicher

In Visual Studio CRT Quelle, \VC\crt\src\malloc.h markieren:

#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

Wenn der Code mit der Option/GZ kompiliert wird, werden diesem Wert automatisch nicht initialisierte Variablen zugewiesen (auf Byte-Ebene).

0xCC ist eine Maschinencodeanweisung zum Aufrufen des Unterbrechungspunkts. Für weitere Informationen see another question.

5

Der Compiler tut dies für Sie im Debug-Modus, so dass, wenn Sie versehentlich nicht initialisierten Speicher lesen, können Sie den unverwechselbaren 0xCC Wert sehen werden, und erkennen, dass Sie (wahrscheinlich) nicht initialisierten Speicher lesen. Der 0xCC Wert hat viele andere nützliche Eigenschaften, zum Beispiel ist es der Maschinensprachbefehl für einen Hardware-Haltepunkt aufgerufen wird, sollen Sie versehentlich etwas nicht initialisierten Speicher auszuführen.

Das Grundprinzip: macht es einfach, Wert zu identifizieren, die beim Lesen nicht initialisierten Speicher kommen.

Dies geschieht nicht in Ihren Release-Builds. Diese Methode wurde in Writing Solid Code eingeführt.

Verwandte Themen