_calloc_dbg
Asigna bloques de memoria en el montón con espacio adicional para un encabezado de depuración y sobrescribir búferes (solo versión de depuración).
Sintaxis
void *_calloc_dbg(
size_t num,
size_t size,
int blockType,
const char *filename,
int linenumber
);
Parámetros
number
Número de bloques de memoria solicitado.
size
Tamaño de cada bloque de memoria solicitado (bytes).
blockType
Tipo de bloque de memoria solicitado: _CLIENT_BLOCK
o _NORMAL_BLOCK
.
Para obtener información sobre los tipos de bloques de asignación y cómo se usan, consulte Tipos de bloques en el montón de depuración.
filename
Puntero al nombre del archivo de código fuente que solicitó la operación de asignación o NULL
.
linenumber
Número de línea del archivo de código fuente en la que se solicitó la operación de asignación o NULL
.
Los filename
parámetros y linenumber
solo están disponibles cuando _calloc_dbg
se ha llamado explícitamente a o se ha definido la constante de _CRTDBG_MAP_ALLOC
preprocesador.
Valor devuelto
Cuando se lleva a cabo correctamente, esta función devuelve un puntero a la parte del usuario del último bloque de memoria asignado, llama a la nueva función de controlador o devuelve NULL
. Para obtener una descripción completa del comportamiento de retorno, vea la sección de comentarios. Para obtener más información sobre cómo se usa la nueva función de controlador, consulte la calloc
función .
Comentarios
_calloc_dbg
es una versión de depuración de la calloc
función. Cuando _DEBUG
no se define, cada llamada a se reduce a _calloc_dbg
una llamada a calloc
. calloc
y _calloc_dbg
asignan los bloques de memoria number
del montón base, pero _calloc_dbg
proporciona varias características de depuración:
Búferes situados a cada lado de la parte del usuario del bloque para comprobar si hay pérdidas.
Un parámetro de tipo de bloque para realizar el seguimiento de tipos de asignación específicos.
Información de
filename
/linenumber
para determinar el origen de las solicitudes de asignación.
_calloc_dbg
asigna cada bloque de memoria con un poco más de espacio que el size
solicitado. El administrador de montón de depuración usa el espacio adicional para vincular los bloques de memoria de depuración y proporcionar a la aplicación información de encabezado de depuración y sobrescribir búferes. Cuando se asigna el bloque, la parte del usuario del bloque se rellena con el valor 0xCD y cada uno de los búferes de sobrescritura se rellena con 0xFD.
_calloc_dbg
establece errno
en ENOMEM
si se produce un error de asignación de memoria. Se devuelve EINVAL
si la cantidad de memoria necesaria (incluida la sobrecarga ya mencionada) es mayor que _HEAP_MAXREQ
. Para obtener más información sobre este y otros códigos de error, vea errno
, _doserrno
, _sys_errlist
y _sys_nerr
.
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, consulte Detalles del montón de depuración de CRT. Para obtener información sobre las diferencias entre llamar a una función de montón estándar y la versión de depuración, consulte Depuración de versiones de funciones de asignación de montón.
Requisitos
Routine | Encabezado necesario |
---|---|
_calloc_dbg |
<crtdbg.h> |
Para obtener más información sobre compatibilidad, consulte Compatibilidad.
Ejemplo
// crt_callocd.c
// This program uses _calloc_dbg to allocate space for
// 40 long integers. It initializes each element to zero.
#include <stdio.h>
#include <malloc.h>
#include <crtdbg.h>
int main( void )
{
long *bufferN, *bufferC;
// Call _calloc_dbg to include the filename and line number
// of our allocation request in the header and also so we can
// allocate CLIENT type blocks specifically
bufferN = (long *)_calloc_dbg( 40, sizeof(long), _NORMAL_BLOCK, __FILE__, __LINE__ );
bufferC = (long *)_calloc_dbg( 40, sizeof(long), _CLIENT_BLOCK, __FILE__, __LINE__ );
if( bufferN != NULL && bufferC != NULL )
printf( "Allocated memory successfully\n" );
else
printf( "Problem allocating memory\n" );
/ _free_dbg must be called to free CLIENT type blocks
free( bufferN );
_free_dbg( bufferC, _CLIENT_BLOCK );
}
Allocated memory successfully