_expand_dbg

Ändert die Größe eines angegebenen Speicherblocks im Heap durch Erweitern oder Verkürzen des Blocks (nur Debugversion).

Syntax

void *_expand_dbg(
   void *userData,
   size_t newSize,
   int blockType,
   const char *filename,
   int lineNumber
);

Parameter

userData
Zeiger zum vorherigen belegten Speicherblock.

newSize
Angeforderte neue Größe des Blocks (in Bytes).

blockType
Angeforderter Typ für vergrößerten/verkleinerten Block: _CLIENT_BLOCK oder _NORMAL_BLOCK.

filename
Zeiger zum Namen der Quelldatei, der die Erweiterung angefordert hat, oder NULL.

lineNumber
Zeilennummer in der Quelldatei, in der die Erweiterung angefordert wurde, oder NULL.

Die filename Parameter sind lineNumber nur verfügbar, wenn _expand_dbg explizit aufgerufen oder die _CRTDBG_MAP_ALLOC Präprozessorkonstante definiert wurde.

Rückgabewert

Bei erfolgreichem Abschluss gibt _expand_dbg einen Zeiger zum vergrößerten/verkleinerten Speicherblock zurück. Da der Speicher nicht verschoben wird, ist die Adresse mit dem UserData identisch. Wenn ein Fehler aufgetreten ist oder der Block nicht auf die angeforderte Größe erweitert werden konnte, wird er zurückgegeben NULL. Wenn ein Fehler auftritt, wird errno mit Informationen des Betriebssystems über die Art des Fehlers angegeben. Weitere Informationen zu errno, sieheerrno , , _doserrno, _sys_errlistund _sys_nerr.

Hinweise

Die _expand_dbg Funktion ist eine Debugversion der _expand -Funktion. Wenn _DEBUG sie nicht definiert ist, wird jeder Anruf _expand_dbg auf einen Anruf reduziert _expand. Sowohl _expand als auch _expand_dbg ändern die Größe eines Speicherblocks im Basisheap, jedoch verfügt _expand_dbg über mehrere Debugfunktionen: Puffer auf beiden Seiten des Benutzerteils des Blocks zum Prüfen auf Speicherverluste, einen Blocktypparameter zum Nachverfolgen von bestimmten Belegungstypen und filename//lineNumber-Informationen zum Ermitteln des Ursprungs von Belegungsanforderungen.

_expand_dbg ändert die Größe des angegebenen Speicherblocks mit etwas mehr Speicherplatz als der angeforderten newSize. newSize kann größer oder kleiner sein als die Größe des ursprünglich belegten Speicherblocks. Der zusätzliche Speicherplatz wird vom Debug-Heap-Manager verwendet, um die Debugspeicherblöcke zu verknüpfen und der Anwendung Debugheaderinformationen und Überschreiben von Puffern bereitzustellen. Die Größenänderung wird erreicht, indem der ursprüngliche Speicherblock erweitert oder verkürzt wird. _expand_dbg den Speicherblock nicht wie die _realloc_dbg Funktion verschieben.

Wenn newSize größer als die ursprüngliche Blockgröße ist, wird der Speicherblock erweitert. Wenn der Speicherblock während einer Erweiterung nicht um die angeforderte Größe erweitert werden kann, NULL wird zurückgegeben. Wenn newSize kleiner als die ursprüngliche Blockgröße ist, wird der Speicherblock verkürzt, bis die neue Größe erreicht wurde.

Informationen dazu, wie Speicherblöcke in der Debugversion des Basis heap zugeordnet, initialisiert und verwaltet werden, finden Sie unter CRT Debug Heap Details. Informationen zu den Zuordnungsblocktypen und deren Verwendung finden Sie unter "Typen von Blöcken" im Debug-Heap. Informationen zu den Unterschieden zwischen Standard heap-Funktionen und Debugversionen finden Sie unter Debugversionen von Heap-Zuordnungsfunktionen.

Diese Funktion überprüft ihre Parameter. Wenn userData es sich um einen Nullzeiger handelt oder die Größe größer als _HEAP_MAXREQist, ruft diese Funktion einen ungültigen Parameterhandler auf, wie in der Parameterüberprüfung beschrieben. Wenn die weitere Ausführung zugelassen wird, wird errno auf EINVAL festgelegt, und die Funktion gibt NULLbeschrieben.

Anforderungen

Routine Erforderlicher Header
_expand_dbg <crtdbg.h>

Weitere Informationen zur Kompatibilität finden Sie unter Kompatibilität.

Bibliotheken

Nur Debugversionen von C-Laufzeitbibliotheken

Beispiel

// crt_expand_dbg.c
//
// This program allocates a block of memory using _malloc_dbg
// and then calls _msize_dbg to display the size of that block.
// Next, it uses _expand_dbg to expand the amount of
// memory used by the buffer and then calls _msize_dbg again to
// display the new amount of memory allocated to the buffer.
//

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <crtdbg.h>

int main( void )
{
   long *buffer;
   size_t size;

   // Call _malloc_dbg to include the filename and line number
   // of our allocation request in the header
   buffer = (long *)_malloc_dbg( 40 * sizeof(long),
                                 _NORMAL_BLOCK, __FILE__, __LINE__ );
   if( buffer == NULL )
      exit( 1 );

   // Get the size of the buffer by calling _msize_dbg
   size = _msize_dbg( buffer, _NORMAL_BLOCK );
   printf( "Size of block after _malloc_dbg of 40 longs: %u\n", size );

   // Expand the buffer using _expand_dbg and show the new size
   buffer = (long *)_expand_dbg( buffer, size + sizeof(long),
                                 _NORMAL_BLOCK, __FILE__, __LINE__ );

   if( buffer == NULL )
      exit( 1 );
   size = _msize_dbg( buffer, _NORMAL_BLOCK );
   printf( "Size of block after _expand_dbg of 1 more long: %u\n",
           size );

   free( buffer );
   exit( 0 );
}
Size of block after _malloc_dbg of 40 longs: 160
Size of block after _expand_dbg of 1 more long: 164

Kommentar

Die Ausgabe dieses Programms hängt von der Funktionalität des Computers ab, ob alle Abschnitte erweitert werden können. Wenn alle Abschnitte erweitert wurden, wird die Ausgabe im Ausgabeabschnitt wiedergegeben.

Siehe auch

Debugroutinen
_malloc_dbg