Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Изменяет размер указанного блока памяти в куче путем его расширения или сжатия (только отладочная версия).
Синтаксис
void *_expand_dbg(
void *userData,
size_t newSize,
int blockType,
const char *filename,
int lineNumber
);
Параметры
userData
Указатель на ранее выделенный блок памяти.
newSize
Запрашиваемый новый размер для блока (в байтах).
blockType
Запрашиваемый тип для блока с измененным размером: _CLIENT_BLOCK или _NORMAL_BLOCK.
filename
Указатель на имя исходного файла, который запросил операцию расширения, или NULL.
lineNumber
Номер строки в исходном файле, где была запрошена операция расширения, или NULL.
filename Параметры lineNumber доступны только при _expand_dbg явном вызове или _CRTDBG_MAP_ALLOC определении константы препроцессора.
Возвращаемое значение
При успешном завершении _expand_dbg возвращает указатель на блок памяти, размер которого изменен. Так как память не перемещается, адрес совпадает с именем userData. Если произошла ошибка или не удалось развернуть блок до запрошенного размера, возвращается NULL. Если происходит сбой, errno содержит сведения из операционной системы о причине сбоя. Дополнительные сведения о , см. в errnoразделеerrno , _doserrno_sys_errlistи _sys_nerr.
Замечания
Функция _expand_dbg — это отладочная версия _expand функции. Если _DEBUG не определено, каждый вызов _expand_dbg уменьшается до вызова _expand. Функции _expandи _expand_dbg изменяют размер блока памяти в базовой куче, но возможность _expand_dbg поддерживает несколько возможностей отладки: буферы по обеим сторонам пользовательского участка блока для тестирования на наличие утечек, параметр типа блока для отслеживания определенных типов выделения памяти и сведения filename/lineNumber для определения источника запросов выделения памяти.
_expand_dbg изменяет размер указанного блока памяти, выделяя под него немного больше пространства, чем запрашивается в newSize.
newSize может быть больше или меньше размера первоначально выделенного блока памяти. Дополнительное пространство используется диспетчером кучи отладки для связывания блоков памяти отладки и предоставления приложению сведений о заголовках отладки и перезаписи буферов. Изменение размера достигается либо расширением, либо сжатием исходного блока памяти.
_expand_dbg не перемещает блок памяти, как и _realloc_dbg функция.
Если newSize больше исходного размера блока, блок памяти расширяется. Во время расширения возвращается, если блок памяти не может быть развернут для размещения запрошенного размера NULL . Если newSize меньше исходного размера блока, блок памяти сжимается до достижения нового размера.
Сведения о выделении, инициализации и управлении блоками памяти в отладочной версии базовой кучи см. в сведениях об отладочной куче CRT. Сведения о типах блоков выделения и их использовании см. в разделе "Типы блоков" в куче отладки. Сведения о различиях между стандартными функциями кучи и версиями отладки см. в разделе "Отладка версий функций выделения кучи".
Эта функция проверяет свои параметры. Если userData имеет значение NULL, или если размер больше _HEAP_MAXREQ, эта функция вызывает недопустимый обработчик параметров, как описано в разделе проверки параметров. Если выполнение может быть продолжено, для errno задается значение EINVAL , и функция возвращает значение NULL.
Требования
| Маршрут | Обязательный заголовок |
|---|---|
_expand_dbg |
<crtdbg.h> |
Дополнительные сведения о совместимости см. в разделе Совместимость.
Библиотеки
Только отладочные версии библиотек времени выполнения языка C.
Пример
// 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 );
}
Size of block after _malloc_dbg of 40 longs: 160
Size of block after _expand_dbg of 1 more long: 164
Комментарий
Вывод этой программы зависит от того, способен ли ваш компьютер расширить все разделы. Если все разделы развернуты, результат отражается в секции вывода.