_calloc_dbg
Выделяет несколько блоков памяти в куче с дополнительным пространством для отладочного заголовка и буферов перезаписи (только для отладочной версии).
void *_calloc_dbg(
size_t num,
size_t size,
int blockType,
const char *filename,
int linenumber
);
Параметры
num
Запрошенное число блоков памяти.size
Запрошенный размер каждого блока памяти (в байтах).blockType
Запрошенный тип блока памяти: _CLIENT_BLOCK или _NORMAL_BLOCK.Дополнительные сведения о типах блока выделения и способах их использования см. в разделеТипы блоков в куче отладки.
filename
Указатель на имя файла исходного кода, который запросил операцию выделения, или NULL.linenumber
Номер линии в исходном файле, где была запрошена операция выделения, или NULL.
Параметры filename и linenumber доступны, только если _calloc_dbg был вызван явным образом или определена константа препроцессора _CRTDBG_MAP_ALLOC.
Возвращаемое значение
В случае успешного завершения эта функция либо возвращает указатель на пользовательскую часть последнего выделенного блока памяти, вызывает новую функцию обработчика, или возвращает значение NULL. Полное описание поведения возврата см. в разделе Заметки ниже. Дополнительные сведения о том, как используется новая функция обработчика, см. в разделе calloc.
Заметки
_calloc_dbg - отладочная версия функции calloc. Если _DEBUG не определена, каждый вызов _calloc_dbg сводится к вызову calloc. И calloc, и _calloc_dbg выделяют num блоков памяти в базовой куче, но _calloc_dbg предоставляет несколько функций для отладки:
Буферы по обеим сторонам участка пользовательской части для проверки на утечки.
Параметр типа блоков для отслеживания определенных типов выделения.
filename/linenumber сведения для определения места запросов на выделение.
_calloc_dbg выделяет каждый блок памяти с немного большим пространством, чем требовал size. Дополнительное место используется диспетчером отладочной кучи для связывания отладочных блоков памяти и обеспечения приложения сведениями заголовка отладки и буферами перезаписи. При выделении блока, пользовательская часть блока заполняется значением 0xCD, а каждый из буферов перезаписи заполняется 0xFD.
_calloc_dbg устанавливает errno в ENOMEM, если не удается выделить память; возвращает EINVAL, если требуемый объем памяти (включая ранее упомянутую нагрузку) превышает _HEAP_MAXREQ. Сведения об этих и других кодах ошибок см. в разделе errno, _doserrno, _sys_errlist, and _sys_nerr.
Сведения о том, как происходит выделение, инициализация и управление блоками памяти в отладочной версии базовой кучи см. в разделе Сведения о куче отладки CRT. Сведения о различиях между вызовом стандартной функции кучи и ее отладочной версии в отладочной сборке приложения см. в разделе Версии отладки функций выделения кучи.
Требования
Подпрограмма |
Обязательный заголовок |
---|---|
_calloc_dbg |
<crtdbg.h> |
Дополнительные сведения о совместимости см. в разделе Совместимость во введении.
Пример
// 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 );
}
Эквивалент в .NET Framework
Неприменимо. Для вызова стандартной функции C используйте PInvoke. Дополнительные сведения см. в разделе Примеры вызовов неуправляемого кода.