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


_expand_dbg

Изменение размера указанного блока памяти в куче путем его расширения или сжатия (только отладочная версия).

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, and _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. Дополнительные сведения о типах блока выделения и способах их использования см. в разделе Типы блоков в куче отладки. Сведения о различиях между вызовом стандартной функции кучи и ее отладочной версии в отладочной сборке приложения см. в разделе Версии отладки функций выделения кучи.

Эта функция проверяет свои параметры. Если memblock является указателем на 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 );
}
  

Комментарий

Вывод этой программы зависит от способности вашего компьютера расширить все разделы. Если все разделы расширены, то результатом отражается в секции вывода.

Эквивалент в .NET Framework

Неприменимо. Для вызова стандартной функции C используйте PInvoke. Дополнительные сведения см. в разделе Примеры вызовов неуправляемого кода.

См. также

Ссылки

Процедуры отладки

_malloc_dbg