Compartilhar via


_alloca

Aloca memória na pilha.Esta função é desaprovada porque uma versão mais segura está disponível. see _malloca.

void *_alloca( 
   size_t size 
);

Parâmetros

  • [in]size
    Bytes a ser alocada da pilha.

Valor de retorno

O _alloca 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, _alloca 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

_allocaaloca size bytes da pilha do programa.O espaço alocado é liberado automaticamente quando a função de chamada é encerrado (não quando a alocação simplesmente passa fora do escopo).Portanto, não passe o valor do ponteiro retornado por _alloca como um argumento para livre.

Há restrições para chamar explicitamente _alloca 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 _alloca 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 (_alloca () )

  • Manipulador de final de exceção SEH de Windows NT: __finally {_alloca () }

  • Expressão de cláusula catch C++ EH

No entanto, _alloca 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çaObservação de segurança

No Windows XP, se _alloca é 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, _alloca não pode ser usado em __except blocos.Para obter mais informações, consulte /clr restrições.

Requisitos

Rotina

Cabeçalho necessário

_alloca

<malloc.h>

Exemplo

// crt_alloca.c
// This program demonstrates the use of
// _alloca and trapping any exceptions
// that may occur.

#include <windows.h>
#include <stdio.h>
#include <malloc.h>

int main()
{
    int     size = 1000;
    int     errcode = 0;
    void    *pData = NULL;

    // Note: Do not use try/catch for _alloca,
    // use __try/__except, since _alloca throws
    // Structured Exceptions, not C++ exceptions.

    __try {
        // An unbounded _alloca can easily result in a 
        // stack overflow.
        // Checking for a size < 1024 bytes is recommended.
        if (size > 0 && size < 1024)
        {
            pData = _alloca( size );
            printf_s( "Allocated %d bytes of stack at 0x%p",
                      size, pData);
        }
        else
        {
            printf_s("Tried to allocate too many bytes.\n");
        }
    }

    // If an exception occured with the _alloca function
    __except( GetExceptionCode() == STATUS_STACK_OVERFLOW )
    {
        printf_s("_alloca failed!\n");

        // If the stack overflows, use this function to restore.
        errcode = _resetstkoflw();
        if (errcode)
        {
            printf_s("Could not reset the stack!\n");
            _exit(1);
        }
    };
}
  

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.

Consulte também

Referência

Alocação de memória

calloc

malloc

possível realocar

resetstkoflw

_malloca