Was passiert, wenn ich neu zuweisen und die neue Größe ist 0. Ist das gleichbedeutend mit einem freien?

8

Gegeben folgender Code:

%Vor%

Es gibt zurück:

%Vor%

Entspricht das Reallok einem freien?

HINWEIS: Ich verwende MinGW unter WindowsXP.

    
Andrei Ciobanu 30.03.2010, 15:44
quelle

4 Antworten

4

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.

    
dmckee 30.03.2010, 15:48
quelle
8

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 .

    
James McNellis 30.03.2010 15:55
quelle
2

Ссылка sagt ja.

    
munissor 30.03.2010 15:46
quelle
1

Ja

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.

    
Jonathan Leffler 30.03.2010 16:12
quelle

Tags und Links