Delen via


_expand_dbg

Wijzigt de grootte van een opgegeven blok geheugen in de heap door het blok uit te vouwen of te verkleinen (alleen foutopsporingsversie).

Syntaxis

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

Parameterwaarden

userData
Aanwijzer naar het eerder toegewezen geheugenblok.

newSize
Nieuwe grootte aangevraagd voor het blok (in bytes).

blockType
Aangevraagd type voor formaat van blok: _CLIENT_BLOCK of _NORMAL_BLOCK.

filename
Wijs de naam aan van het bronbestand waarvoor de uitbreidingsbewerking is aangevraagd of NULL.

lineNumber
Regelnummer in het bronbestand waar de uitvouwbewerking is aangevraagd of NULL.

De filename parameters lineNumber en parameters zijn alleen beschikbaar wanneer _expand_dbg deze expliciet zijn aangeroepen of als de _CRTDBG_MAP_ALLOC preprocessorconstante is gedefinieerd.

Retourwaarde

Bij een geslaagde voltooiing _expand_dbg wordt een aanwijzer geretourneerd naar het geheugenblok met de grootte. Omdat het geheugen niet wordt verplaatst, is het adres hetzelfde als de userData. Als er een fout is opgetreden of het blok niet kan worden uitgebreid naar de aangevraagde grootte, wordt deze geretourneerd NULL. Als er een fout optreedt, errno vindt u informatie van het besturingssysteem over de aard van de fout. Voor meer informatie over errno, zie errno, , _doserrno, , en _sys_errlist_sys_nerr.

Opmerkingen

De _expand_dbg functie is een foutopsporingsversie van de _expand functie. Wanneer _DEBUG niet is gedefinieerd, wordt elke aanroep _expand_dbg beperkt tot een aanroep naar _expand. Zowel _expand als _expand_dbg het formaat van een geheugenblok in de basis-heap wijzigen, maar _expand_dbg biedt plaats aan verschillende foutopsporingsfuncties: buffers aan beide zijden van het blok om te testen op lekken, een bloktypeparameter voor het bijhouden van specifieke toewijzingstypen en filename/lineNumber informatie om de oorsprong van toewijzingsaanvragen te bepalen.

_expand_dbg wijzigt de grootte van het opgegeven geheugenblok met iets meer ruimte dan het aangevraagde newSize. newSize kan groter of kleiner zijn dan de grootte van het oorspronkelijk toegewezen geheugenblok. De extra ruimte wordt gebruikt door de heap-manager voor foutopsporing om de foutopsporingsgeheugenblokken te koppelen en om de toepassing informatie over de foutopsporingsheader te bieden en buffers te overschrijven. Het formaat wordt bereikt door het oorspronkelijke geheugenblok uit te breiden of te verkleinen. _expand_dbg verplaatst het geheugenblok niet, net als de _realloc_dbg functie.

Wanneer newSize deze groter is dan de oorspronkelijke blokgrootte, wordt het geheugenblok uitgevouwen. Als het geheugenblok tijdens een uitbreiding niet kan worden uitgebreid om de aangevraagde grootte aan te bieden, NULL wordt deze geretourneerd. Wanneer newSize het blok kleiner is dan de oorspronkelijke blokgrootte, wordt het geheugenblok gecontracteerd totdat de nieuwe grootte wordt verkregen.

Zie CRT-foutopsporingsdetails voor informatie over hoe geheugenblokken worden toegewezen, geïnitialiseerd en beheerd in de foutopsporingsversie van de basis-heap. Zie Typen blokken in de heap voor foutopsporing voor informatie over de typen toewijzingsblokken en hoe ze worden gebruikt. Zie Foutopsporingsversies van heap-toewijzingsfuncties voor informatie over de verschillen tussen standaard-heap-functies en foutopsporingsversies.

Met deze functie worden de parameters gevalideerd. Als userData een null-aanwijzer is, of als de grootte groter is dan _HEAP_MAXREQ, roept deze functie een ongeldige parameterhandler aan, zoals beschreven in parametervalidatie. Als de uitvoering mag worden voortgezet, errno is ingesteld op EINVAL en retourneert NULLde functie.

Requirements

Routine Vereiste header
_expand_dbg <crtdbg.h>

Zie Compatibiliteit voor meer compatibiliteitsinformatie.

Libraries

Fouten opsporen in versies van C-runtimebibliotheken alleen.

Example

// 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

Comment

De uitvoer van dit programma is afhankelijk van de mogelijkheid van uw computer om alle secties uit te vouwen. Als alle secties zijn uitgevouwen, wordt de uitvoer weergegeven in de sectie Uitvoer.

Zie ook

Fouten opsporen in routines
_malloc_dbg