Ganchos de alocação e alocações de memória C em tempo de execução
Este tópico se aplica a:
Edição |
Visual Basic |
C# |
C++ |
Desenvolvedores Web |
---|---|---|---|---|
Express |
Somente nativo |
|||
Padrão |
Somente nativo |
|||
PRO e equipe |
Somente nativo |
Legenda de tabela:
Aplica-se |
|
Não é aplicada |
|
Comando ou comandos oculta por padrão. |
Uma restrição muito importante sobre as funções de gancho de alocação é que eles devem ignorar explicitamente _CRT_BLOCK blocos (as alocações de memória feitas internamente pelo C em time de execução funções da biblioteca) se fizerem quaisquer chamadas ao C em time de execução funções da biblioteca que alocam memória interna. The _CRT_BLOCK blocos podem ser ignorados com a inclusão de código, sistema autônomo o seguinte no início de sua alocação capturar a função:
if ( nBlockUse == _CRT_BLOCK )
return( TRUE );
Se sua alocação de gancho não ignora _CRT_BLOCK blocos e, em seguida, qualquer C em time de execução função de biblioteca chamada no gancho do seu pode interceptar o programa em um loop infinito. Por exemplo, printf faz uma alocação interna. Se seu código de gancho chama printf, em seguida, a alocação resultante fará com que o gancho a ser chamado novamente, que chamará printf novamente e assim por diante até que estouros de pilha.Se você precisar informar _CRT_BLOCK operações de alocação, uma maneira de contornar essa restrição é utilizar funções da API do Windows, em vez de C em time de execução funções, para formatação e de saída. Como as APIs do Windows não usam o C em time de execução biblioteca heap, eles não serão executado o gancho de alocação em um loop infinito.
Se você examinar o em time de execução biblioteca de arquivos de fonte, você verá a alocação padrão para capturar a função, CrtDefaultAllocHook (que simplesmente retorna TRUE), está em um arquivo separado de seu próprio, DBGHOOK.C.Se você desejar que o gancho de alocação a ser chamado até mesmo para as alocações feitas pelo código de inicialização de time de execução que é executado antes principal função, você pode substituir essa função padrão por uma de sua preferência, em vez de usar _CrtSetAllocHook.
Consulte também
Tarefas
Exemplo de crt_dbg2: C Run-Time Depurando gancho funções