Compartir a través de


_expand_dbg

Cambia el tamaño de un bloque de memoria especificado en el montón, ya sea expandiendo o contrayendo el bloque (solo versión de depuración).

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

Parámetros

  • userData
    Puntero al bloque de memoria asignado previamente.

  • newSize
    Nuevo tamaño solicitado para el bloque (en bytes).

  • blockType
    Tipo solicitado para el bloque cuyo tamaño ha cambiado: _CLIENT_BLOCK o _NORMAL_BLOCK.

  • filename
    Puntero al nombre del archivo de código fuente que solicitó la operación de expansión, o NULL.

  • linenumber
    Número de línea del archivo de código fuente en la que se solicitó la operación de expansión, o NULL.

Los parámetros filename y linenumber solo están disponibles cuando se ha llamado a _expand_dbg explícitamente o se ha definido la constante de preprocesador _CRTDBG_MAP_ALLOC.

Valor devuelto

Cuando se ejecuta correctamente, _expand_dbg devuelve un puntero al bloque de memoria cuyo tamaño ha cambiado. Dado que la memoria no se mueve, la dirección es la misma que la de userData. Si se produce un error o el bloque no se puede expandir al tamaño solicitado, devuelve NULL. Si se produce un error, se devuelve errno con información del sistema operativo sobre la naturaleza del error. Para obtener más información sobre errno, vea errno, _doserrno, _sys_errlist y _sys_nerr.

Comentarios

La función _expand_dbg es una versión de depuración de la función _expand. Si no se define _DEBUG, cada llamada a _expand_dbg se reduce a una llamada a _expand. _expand y _expand_dbg cambian el tamaño de un bloque de memoria del montón base, pero _expand_dbg admite varias características de depuración: búferes situados a cada lado de la parte del usuario del bloque en el que se va a comprobar si hay pérdidas, un parámetro de tipo de bloque para realizar el seguimiento de tipos de asignación concretos, e información sobre filename o linenumber para determinar el origen de las solicitudes de asignación.

_expand_dbg cambia el tamaño del bloque de memoria especificado con un poco más de espacio que el newSize solicitado. newSize podría ser mayor o menor que el tamaño del bloque de memoria asignado originalmente. El administrador del montón de depuración usa el espacio adicional para vincular los bloques de memoria de depuración, y para proporcionar a la aplicación información de encabezado de depuración y sobrescribir los búferes. El cambio de tamaño es realiza expandiendo o contrayendo el bloque de memoria original. _expand_dbg no mueve el bloque de memoria, algo que si hace la función _realloc_dbg.

Si newSize es mayor que el tamaño del bloque original, el bloque de memoria se expande. Durante una extensión, si el bloque de memoria no se puede expandir para adaptarse al tamaño solicitado, se devuelve NULL. Si newSize es menor que el tamaño del bloque original, el bloque de memoria se contrae hasta que tiene el nuevo tamaño.

Para obtener información sobre cómo se asignan, inicializan y administran los bloques de memoria en la versión de depuración del montón base, vea Detalles del montón de depuración de CRT. Para obtener información sobre la asignación de tipos de bloque y cómo se usan, vea Tipos de bloques en el montón de depuración. Para obtener información sobre las diferencias entre llamar a una función estándar del montón y su versión de depuración en una compilación de depuración de una aplicación, vea Versiones de depuración de las funciones de asignación del montón.

Esta función valida sus parámetros. Si memblock es un puntero nulo, o si el tamaño es mayor que _HEAP_MAXREQ, esta función invoca un controlador de parámetros no válidos, como se describe en Validación de parámetros. Si la ejecución puede continuar, errno se establece en EINVAL y la función devuelve NULL.

Requisitos

Rutina

Encabezado necesario

_expand_dbg

<crtdbg.h>

Para obtener más información sobre compatibilidad, vea Compatibilidad.

Bibliotecas

Solo las versiones de depuración de las bibliotecas en tiempo de ejecución de C.

Ejemplo

// 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 );
}
  

Comment

El resultado de este programa depende de la capacidad del equipo de expandir todas las secciones. Si se expanden todas las secciones, el resultado se refleja en la sección de salida.

Equivalente en .NET Framework

No es aplicable Para llamar a la función estándar de C, use PInvoke. Para obtener más información, vea Ejemplos de invocación de plataforma.

Vea también

Referencia

Rutinas de depuración

_malloc_dbg