Wie finde ich heraus, wie viel Speicherplatz durch einen Aufruf von malloc () zugewiesen wird?

7

Ich versuche, eine Größenfunktion wie folgt zu schreiben:

%Vor%

Dies würde die Größe eines Arrays zurückgeben, auf das p zeigt. Zum Beispiel:

%Vor%

Ich denke, das ist möglich, denn wenn ich mich erinnere, verfolgt malloc den Platz, der in einigen Header-Bytes zugewiesen wurde.

Folgendes habe ich bisher:

%Vor%

Wenn nun angenommen wird, dass die Größe des zugewiesenen Speicherplatzes in den 4 Bytes vor dem Zeiger liegt, sollte dies die Bytes oder den Offset zurückgeben. Hier bin ich ein wenig im Dunkeln. Ich kann nicht herausfinden, wie malloc diese Header-Bytes formatiert. Wie verpackt Malloc die Header-Bits?

Danke, ich weiß das zu schätzen. Ich bin mir sicher, dass mit diesem Code etwas nicht stimmt und dass es nicht besonders portabel ist und möglicherweise sehr systemabhängig ist, aber ich mache es zum Spaß.

    
kodai 07.10.2010, 23:04
quelle

7 Antworten

6

Wenn Sie gerne einen Blick hinter die Erinnerung werfen, die Ihr malloc () zurückgibt, empfehle ich, den Quellcode Ihres Zuordners zu erhalten. Dies wird schneller und sicherer als das Experimentieren sein. ; -)

    
Peter G. 07.10.2010, 23:07
quelle
6

In Visual Studio können Sie _msize() verwenden .

    
ruslik 07.10.2010 23:07
quelle
4

Ich denke, Sie verlassen sich auf ein umsetzungsspezifisches Verhalten malloc() . Die Implementierung von malloc() ist systemspezifisch und die Spezifikation erwähnt sehr wenig darüber durchgeführt.

    
Brian Agnew 07.10.2010 23:08
quelle
2

Es gibt keinen tragbaren Weg, dies zu tun. Wie andere bereits gesagt haben, schauen Sie sich den Code Ihres Allokators an, wenn Sie ein einmaliges Programm machen, das nur herumstochert, oder für einige Bibliotheken (MS) gibt es Erweiterungen wie _msize . malloc darf innerhalb des Allokators tun, was es will, um Dinge zu verfolgen, und es gibt keine "sichere" oder standardkonforme Art, diese Daten zu bekommen.

Wenn Sie diese Funktion in einer echten Anwendung wirklich benötigen, müssen Sie eine Unterroutine um malloc/free erstellen, die eine Tabelle mit Zuordnungsgrößen enthält.

    
Ben Zotto 07.10.2010 23:15
quelle
1

Sie finden möglicherweise die glibc malloc-bezogenen Funktionen um nützlich zu sein. Insbesondere können Sie mallinfo() aufrufen um Heap-Informationen zu erhalten. Einige Systeme definieren auch malloc_size , was das BSD-Äquivalent von _msize .

    
Matt Joiner 08.10.2010 02:29
quelle
0

Wenn Sie wirklich diese Route verwenden möchten, hat dlmalloc (das malloc, das unter anderem auf glibc und uClibc verwendet wird) einige Dokumente unter Ссылка . Wenn Sie nach Heap-Überläufen suchen, erhalten Sie wahrscheinlich auch Details für jede Plattform, einschließlich solche ohne Quellcode.

    
ninjalj 08.10.2010 00:02
quelle
0

Es ist nicht im Standard. Dafür gibt es plattformspezifische Funktionen wie _msize oder malloc_usable_size .

    
dan04 08.10.2010 13:48
quelle

Tags und Links