Gegeben folgender Code:
%Vor%Es gibt zurück:
%Vor%Entspricht das Reallok einem freien?
HINWEIS: Ich verwende MinGW unter WindowsXP.
Nicht unbedingt.
Es funktioniert oft wie bei Link, den Munissor gepostet hat , aber die Mac OS 10.5 man-Seite sagt:
Wenn die Größe null ist und ptr nicht NULL ist, wird ein neues Objekt mit der Mindestgröße zugewiesen und das ursprüngliche Objekt wird freigegeben.
Was ist ein "minimum sized object"? Nun, jeder Zuordner speichert einige Informationen über die Zuordnungen, und das nimmt Platz, der oft zusätzlich zu dem für den Benutzer reservierten Platz zugewiesen wird. Vermutlich ist ein "minimum sized object" nur einer dieser Header plus null Bytes Speicherplatz, der für den Benutzer reserviert ist.
Ich würde vermuten, dass diese Bestimmung vorhanden ist, um Implementierungen zu unterstützen, die zum Zeitpunkt der Standardisierung existierten, und dass diese Implementierungen nützlich sind, um das Zuordnungsverhalten zu debuggen.
Um zu adressieren Jonathans Kommentare
Betrachte den Unterschied zwischen
%Vor%und
%Vor% Bei einer vernünftigen Implementierung von malloc
und free
verbraucht der erste Clip nicht Speicher ohne Bindung. Aber wenn die realloc
-Implementierung diese "Objekte mit der minimalen Größe" zurückgibt, könnte dies der Fall sein.
Sicherlich ist dieses Beispiel erfunden und beruht darauf zu verstehen, was mit "minimum sized object" gemeint ist, aber ich denke, dass Text es erlaubt.
Kurz gesagt, wenn Sie free
meinen, sollten Sie free
sagen.
Es kann oder kann nicht gleichbedeutend mit dem Aufruf von free
auf dem Zeiger sein; Das Ergebnis ist implementierungsdefiniert.
Aus dem C99-Standard (§7.20.3 / 1):
Wenn die Größe des angeforderten Speicherplatzes Null ist, ist das Verhalten implementierungsdefiniert: Entweder wird ein Nullzeiger zurückgegeben oder das Verhalten ist so, als wäre die Größe ein Wert ungleich Null, außer dass der zurückgegebene Zeiger nicht verwendet werden soll Zugriff auf ein Objekt.
Dies gilt für alle Speicherverwaltungsfunktionen, einschließlich realloc
.
Der C99-Standard §7.20.3.4 (realloc) sagt:
Die Realloc-Funktion hebt das alte Objekt auf, auf das ptr zeigt, und gibt a zurück Zeiger auf ein neues Objekt, dessen Größe durch die Größe angegeben wird. Der Inhalt des neuen Das Objekt muss vor dem Aufheben der Zuordnung dem alten Objekt entsprechen, bis auf das kleinere die neuen und alten Größen. Alle Bytes im neuen Objekt haben die Größe des alten Objekts unbestimmte Werte.
Wenn ptr ein Null-Zeiger ist, verhält sich die realloc-Funktion wie die malloc-Funktion für die angegebene Größe. Andernfalls, wenn ptr nicht mit einem Zeiger übereinstimmt, der früher von der zurückgegeben wurde Calloc-, Malloc- oder Realloc-Funktion, oder wenn der Speicherplatz durch einen Aufruf freigegeben wurde Bei der Funktion free oder realloc ist das Verhalten nicht definiert. Wenn Speicher für das neue Objekt kann nicht zugeordnet werden, das alte Objekt wird nicht freigegeben und sein Wert ist unverändert.
Dies besagt eindeutig, dass das alte Objekt freigegeben (freigegeben) wird. Der Rückgabewert könnte ein Null-Zeiger oder ein Wert sein, wie er in den allgemeinen Hinweisen zu §7.20.3 angegeben ist:
Wenn die Größe des angeforderten Speicherplatzes null ist, ist das Verhalten der Implementierung definiert: Entweder wird ein Null-Zeiger zurückgegeben, oder das Verhalten ist so, als ob die Größe etwas wäre Nicht-Null-Wert, außer dass der zurückgegebene Zeiger nicht für den Zugriff auf ein Objekt verwendet werden soll.
In beiden Fällen kann der zurückgegebene Wert nicht dereferenziert werden: Er könnte als Argument für free()
verwendet oder an andere Funktionen übergeben werden, solange diese nicht darauf verweisen.