Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Redimensiona um bloco especificado de memória no heap pela expansão ou contração do bloco (somente versão de depuração).
Sintaxe
void *_expand_dbg(
void *userData,
size_t newSize,
int blockType,
const char *filename,
int lineNumber
);
Parâmetros
userData
Ponteiro para o bloco de memória alocado anteriormente.
newSize
Solicitou o novo tamanho do bloco (em bytes).
blockType
Tipo de bloco redimensionado solicitado: _CLIENT_BLOCK ou _NORMAL_BLOCK.
filename
Ponteiro para o nome do arquivo de origem que solicitou a operação de expansão ou NULL.
lineNumber
Número de linha do arquivo de origem em que a operação de expansão foi solicitada ou NULL.
Os filename parâmetros and lineNumber só estão disponíveis quando _expand_dbg foram chamados explicitamente ou a constante do _CRTDBG_MAP_ALLOC pré-processador foi definida.
Valor retornado
Após a conclusão bem-sucedida, _expand_dbg retorna um ponteiro para o bloco de memória redimensionado. Como a memória não é movida, o endereço é o mesmo que o userData. Se ocorreu um erro ou o bloco não pôde ser expandido para o tamanho solicitado, ele retornará NULL. Se ocorrer uma falha, errno terá informações do sistema operacional sobre a natureza da falha. Para obter mais informações sobre errno, consulte errno, _doserrno, _sys_errlist e _sys_nerr.
Comentários
A _expand_dbg função é uma versão de depuração da _expand função. Quando _DEBUG não estiver definido, cada chamada para _expand_dbg é reduzida a uma chamada para _expand. Tanto _expand quanto _expand_dbg redimensionam um bloco de memória no heap de base, mas _expand_dbg acomoda diversos recursos de depuração: buffers dos dois lados da porção do usuário do bloco para verificar se há perdas, um parâmetro de tipo de bloco para acompanhar tipos específicos de alocação e informações filename/lineNumber para determinar a origem das solicitações de alocação.
_expand_dbg realoca o bloco de memória especificado com um pouco mais de espaço que o newSize solicitado.
newSize pode ser maior ou menor que o espaço do bloco de memória alocado originalmente. O espaço extra é usado pelo gerenciador de heap de depuração para vincular os blocos de memória de depuração e fornecer ao aplicativo informações de cabeçalho de depuração e buffers de substituição. O redimensionamento é realizado pela expansão ou contração do bloco de memória original.
_expand_dbg não move o bloco de memória, assim como a _realloc_dbg função.
Quando newSize for maior do que o tamanho do bloco original, o bloco de memória será expandido. Durante uma expansão, se o bloco de memória não puder ser expandido para acomodar o tamanho solicitado, NULL será retornado. Quando newSize for menor do que o tamanho do bloco original, o bloco de memória será contraído até que o novo tamanho seja obtido.
Para obter informações sobre como os blocos de memória são alocados, inicializados e gerenciados na versão de depuração do heap base, consulte Detalhes do heap de depuração do CRT. Para obter informações sobre os tipos de bloco de alocação e como eles são usados, consulte Tipos de blocos no heap de depuração. Para obter informações sobre as diferenças entre funções de heap padrão e versões de depuração, consulte Depurar versões de funções de alocação de heap.
Essa função valida seus parâmetros. Se userData for um ponteiro nulo ou se size for maior que _HEAP_MAXREQ, essa função invocará um manipulador de parâmetro inválido, conforme descrito em Validação de parâmetro. Se a execução tiver permissão para continuar, errno será definido como EINVAL e a função retornará NULL.
Requisitos
| Rotina | Cabeçalho necessário |
|---|---|
_expand_dbg |
<crtdbg.h> |
Para obter informações sobre compatibilidade, consulte Compatibilidade.
Bibliotecas
Somente versões de depuração de bibliotecas de tempo de execução C.
Exemplo
// 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
Comentário
A saída desse programa depende da capacidade do seu computador de expandir todas as seções. Se todas as seções estiverem expandidas, a saída será refletida na seção de saída.