_malloca
Aloca memória na pilha.Esta é uma versão do _alloca com aprimoramentos de segurança, conforme descrito em Recursos de segurança no CRT.
void *_malloca(
size_t size
);
Parâmetros
- size
Bytes a ser alocada da pilha.
Valor de retorno
O _malloca rotina retorna um void o ponteiro para o espaço alocado, o que é garantido para ser devidamente alinhado para o armazenamento de qualquer tipo de objeto.Se size é 0, _malloca aloca um item de comprimento zero e retorna um ponteiro válido para esse item.
Uma exceção de estouro de pilha é gerada se o espaço não alocado.A exceção de estouro de pilha não é uma exceção de C++; é uma exceção estruturada.Em vez de usar o tratamento de exceções do C++, você deve usar Structured Exception Handling (SEH).
Comentários
_mallocaaloca size bytes de pilha do programa ou o heap se a solicitação excede um determinado tamanho em bytes, indicado por _ALLOCA_S_THRESHOLD.A diferença entre _malloca e _alloca é que _alloca sempre aloca na pilha, independentemente do tamanho.Ao contrário do _alloca, que não exigem ou permitem que uma chamada para free para liberar a memória alocada tão, _malloca requer o uso de _freea para liberar memória.No modo de depuração, _malloca sempre aloca a memória do heap.
Há restrições para chamar explicitamente _malloca em um manipulador de exceção (EH).Rotinas EH que são executados no x processadores de classe x86 operam em seu próprio quadro de memória: eles realizem suas tarefas no espaço de memória que não se baseia no local atual do ponteiro de pilha da função delimitador.As implementações mais comuns incluem (SEH) de manipulação de exceção de Windows NT estruturado e expressões de cláusula catch C++.Portanto, chamar explicitamente _malloca em qualquer um dos seguintes resultados cenários no caso de falha do programa durante o retorno para chamar a rotina EH:
Expressão de filtro de exceção SEH Windows NT: __except (_malloca () )
Manipulador de final de exceção SEH de Windows NT: __finally {_malloca () }
Expressão de cláusula catch C++ EH
No entanto, _malloca pode ser chamado diretamente a partir de uma rotina de EH ou de um retorno de chamada fornecido pelo aplicativo chamado por um dos cenários EH listados anteriormente.
Observação de segurança |
---|
No Windows XP, se _malloca é chamado dentro de um bloco try/catch, você deve chamar _ resetstkoflw no bloco catch. |
Com as restrições acima, ao usar o /clr (Common Language Runtime Compilation) opção, _malloca não pode ser usado em __except blocos.Para obter mais informações, consulte /clr restrições.
Requisitos
Rotina |
Cabeçalho necessário |
---|---|
_malloca |
<malloc.h> |
Exemplo
// crt_malloca_simple.c
#include <stdio.h>
#include <malloc.h>
void Fn()
{
char * buf = (char *)_malloca( 100 );
// do something with buf
_freea( buf );
}
int main()
{
Fn();
}
// crt_malloca_exception.c
// This program demonstrates the use of
// _malloca and trapping any exceptions
// that may occur.
#include <windows.h>
#include <stdio.h>
#include <malloc.h>
int main()
{
int size;
int numberRead = 0;
int errcode = 0;
void *p = NULL;
void *pMarker = NULL;
while (numberRead == 0)
{
printf_s("Enter the number of bytes to allocate "
"using _malloca: ");
numberRead = scanf_s("%d", &size);
}
// Do not use try/catch for _malloca,
// use __try/__except, since _malloca throws
// Structured Exceptions, not C++ exceptions.
__try
{
if (size > 0)
{
p = _malloca( size );
}
else
{
printf_s("Size must be a positive number.");
}
_freea( p );
}
// Catch any exceptions that may occur.
__except( GetExceptionCode() == STATUS_STACK_OVERFLOW )
{
printf_s("_malloca failed!\n");
// If the stack overflows, use this function to restore.
errcode = _resetstkoflw();
if (errcode)
{
printf("Could not reset the stack!");
_exit(1);
}
};
}
Entrada
1000
Saída de exemplo
Enter the number of bytes to allocate using _malloca: 1000
Equivalência do .NET Framework
Não aplicável. Para chamar a função c padrão, use PInvoke. Para obter mais informações, consulte Exemplos de invocação de plataforma.