Ganchos de alocação e as alocações de memória de tempo de execução c
This topic applies to:
Edition |
Visual Basic |
C# |
F# |
C++ |
Web Developer |
---|---|---|---|---|---|
Express |
Native only |
||||
Pro, Premium e Ultimate |
Native only |
Uma restrição muito importante nas funções de gancho de alocação é que eles devem ignorar explicitamente _CRT_BLOCK blocos (as alocações de memória feitas internamente pelas funções de biblioteca de tempo de execução C) se tornarem todas as chamadas para funções de biblioteca de tempo de execução c alocar memória interno. O _CRT_BLOCK blocos podem ser ignorados, incluindo o código como, por exemplo, o seguinte no início da sua alocação capturar a função:
if ( nBlockUse == _CRT_BLOCK )
return( TRUE );
Se o gancho de alocação não ignorar _CRT_BLOCK bloqueia, então qualquer função de biblioteca de tempo de execução c chamada em seu gancho pode interceptar o programa em um loop infinito. Por exemplo, printf faz alocação interno. Se o seu código de gancho chama printf, em seguida, a alocação resultante fará com que o gancho ser chamado novamente, que chamará printf novamente, e assim por diante até que os estouros de pilha. Se você precisar de relatório _CRT_BLOCK operações de alocação, uma maneira de contornar essa restrição é usar funções de API do Windows, em vez de usar as funções de tempo de execução C, para formatação e de saída. Como as APIs do Windows não usam a pilha de biblioteca de tempo de execução C, eles não ajustarão o gancho de alocação em um loop infinito.
Se você examinar os arquivos de origem da biblioteca de tempo de execução, você verá que a alocação padrão capturar a função, CrtDefaultAllocHook (que simplesmente retorna TRUE), está localizado em um arquivo separado de seu próprio, DBGHOOK.C. Se você deseja que o gancho de alocação a ser chamado até mesmo para as alocações feitas pelo código de inicialização de tempo de execução que é executado antes do aplicativo principal função, você pode substituir essa função padrão com uma de sua preferência, em vez de usar _CrtSetAllocHook.
Consulte também
Tarefas
Exemplo de crt_dbg2: Funções de gancho de depuração c Run-Time.