Ganchos de alocação e alocações de memória de tempo de execução do C
Uma restrição muito importante em funções de gancho de alocação é que devem ignorar explicitamente blocos _CRT_BLOCK (as alocações de memória feitas internamente por funções da biblioteca em tempo de execução C) se fizerem chamadas às funções da biblioteca em tempo de execução C que alocam a memória interna. Os blocos _CRT_BLOCK podem ser ignorados incluindo o código como, por exemplo, o seguinte no início da função de gancho de alocação:
if ( nBlockUse == _CRT_BLOCK )
return( TRUE );
Se seu gancho de alocação não ignorar blocos _CRT_BLOCK, qualquer função de biblioteca em tempo de execução C chamada em seu gancho pode interceptar o programa em um loop infinito. Por exemplo, printf faz uma alocação interna. Se seu código de gancho chamar printf, a alocação resultante fará o gancho ser chamado novamente, que chamará printf novamente e assim por diante, até o estouro de pilha. Se você precisar reportar operações de alocação _CRT_BLOCK, uma maneira de evitar essa restrição é usar funções de API do Windows, em vez de funções de tempo de execução C, para formatação e saída. Como as APIs do Windows não usam o heap da biblioteca em tempo de execução C, elas não interceptarão seu gancho de alocação em um loop infinito.
Se você examinar os arquivos de origem da biblioteca em tempo de execução, verá que a função padrão de gancho de alocação, CrtDefaultAllocHook (que retorna apenas TRUE), está localizada em um arquivo separado, DBGHOOK.C. Se você quiser que o gancho de alocação seja chamado mesmo para as alocações feitas pelo código de inicialização de tempo de execução que é executado antes da função principal de seu aplicativo, você poderá substituir essa função padrão por um de seus próprios, em vez de usar _CrtSetAllocHook.