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