Frage

int main ()
{
    int * b;
    b = (int*) malloc (1);
    *b=110000;
    free (b);
    return 0;
}

Warum Heapbeschädigung bei free (b); passieren?

IMO, Heapbeschädigung geschieht bereits bei *b=110000;.

War es hilfreich?

Lösung

malloc() Argument ist die Anzahl der Bytes zuzuordnen. Sie müssen Verwendung:

b = (int*) malloc(sizeof(int));

Sie haben eine zu kleine Block zugeordnet, und dann geschrieben mehr Bytes zu bieten als Sie zugewiesen haben, die überschreibt Informationen Buchhaltung neben dem Block, den Heap korrumpieren.

Andere Tipps

Es ist * b = 110000; Da Sie den Speicher für ein Byte sind die Zuteilung und dann einen int hinein zuweisen, die mehr als ein Byte ist. Entweder kann man b = (int *) malloc (sizeof (int)) oder anstelle von int * b Sie können char * b und dann warf den malloced Zeiger auf char *. Der Code wird auch funktionieren, wenn Sie einen Wert zuweisen, das weniger als 128 ist (wegen des signed char) zu * b.

EDIT: - Ich denke, manchmal auch dies ohne Aufwand arbeiten. Da der Compiler können für den schnellen Zugriff von Daten mehr als ein Byte Speicher zuzuweisen.

Die Heapbeschädigung in die Tat geschieht bereits bei der *b=11000 Zuordnung, aber es ist erst der free(b) Anruf erkannt, weil das der erste Punkt ist, wo die Integrität des Haufens wieder überprüft wird.

bei jedem Auftrag die Heap-Prüfung der Integrität (oder sogar jeder Zuweisung eines dereferenzierten Zeiger beteiligt) würden die meisten Programme verlangsamen zu viel und es würde den Compiler zu fest in die Bibliothek Umsetzung binden. Aus diesem Grund werden die Integritätsprüfungen nur durchgeführt, wenn der Heap manipuliert wird, die in den malloc und free Funktionen (und Freunde).

Der Code schreibt mehr Daten in den Speicherblock als der Raum zur Verfügung, um es somit den Beginn des nächsten gültigen Speicherblockes korrumpiert.

char * statt int * und einen Wert zu schreiben -128 bis 127 * b sollte es beheben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top