Поделиться через


_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

См. также

Отладка подпрограмм
calloc
_malloc_dbg
_DEBUG