Artigo: 555563 - Última revisão: sábado, 11 de Fevereiro de 2006 - Revisão: 1.0

Não chamar DisableThreadLibraryCalls " " numa DLL que está ligado o CRT estaticamente

Author: Jochen Kalmbach MVP
Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.
Expandir tudo | Reduzir tudo

Sumário

Nunca se construir uma DLL C/C ++, que fornece uma hiperligação para o CRT multithread, de forma estática que deverá chamar DisableThreadLibraryCalls " ". Isto pode conduzir a fugas de memória se o autor da chamada da DLL cria / destroys muitos threads.

Sintomas

Se tiver criado uma DLL que chama DisableThreadLibraryCalls " " para impedir que a chamada de DllMain " " para cada thread criação / Termination e estiver a ligar contra o CRT multithread, o processo irá desviados memória se este cria e destrói muitos threads e chama a dll destes threads. Verá um aumento de " Private Bytes " do processo.
O tamanho da fuga depende o CRT utilizado. Mas o mínimo para VC7.1 é cerca de 140 bytes para VC8 cerca de bytes 532 por thread. Dependendo do CRT utilizado funções que pode mesmo muito mais ter atribuído de dados. Se o processo cria e destrói muitos threads, isto pode conduzir a problemas se você tiver uma aplicação de longa duração.

Causa

Para várias funções CRT é necessário o CRT está internamente memória de atribuição num regime por-threads. Se um CRT funciona tem de utilizar esta memória e esta memória é ainda não atribuída para o thread actual, irá atribuir a memória interna necessária e armazenar o ponteiro no TLS-(memória local thread) ou ranhura FLS-(memória local Fiber). Estes memória normalmente são liberte se você chamar _endthread(ex) " ".
Mas se o thread foi criado fora da DLL, o estaticamente CRT dentro da DLL sabe nada sobre este thread. Lo apenas atribuído memória caso de não ser atribuída a memória interna para o thread actual. A única forma para impedir que este fuga consiste em escutar o DLL_THREAD_DETACH " " na chamada de retorno DllMain " ". Esta função é chamada se um thread foi destruído. O CRT pode parecer se que lhe tenha atribuída memória interna para este thread e pode lançá-lo.
Agora, se você chamar DisableThreadLibraryCalls " " impede a notificação de DLL_THREAD_DETACH " " para a DLL. Assim o CRT tem qualquer alteração para libertar a memória interna.

Resolução

Para resolver este problema, tem duas opções:
  • Não chamar DisableThreadLibraryCalls " "
  • Ligar contra a versão DLL do CRT

Mais Informação

Este artigo também se aplica ao Microsoft Visual C++.NET 2005

A informação contida neste artigo aplica-se a:
  • Microsoft Visual C++ .NET 2003 Standard Edition
  • Microsoft Visual C++ .NET 2002 Standard Edition
Palavras-chave: 
kbpubmvp kbpubtypecca kbhowto KB555563 KbMtpt kbmt
Tradução automáticaTradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Pedíamos-lhe o favor de preencher o formulário existente no fundo desta página caso tenha encontrado erros neste artigo e tenha possibilidade de colaborar no processo de aperfeiçoamento desta ferramenta. Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 555563  (http://support.microsoft.com/kb/555563/en-us/ )
Community Solutions ContentCOMMUNITY SOLUTIONS CONTENT DISCLAIMER
MICROSOFT CORPORATION AND/OR ITS RESPECTIVE SUPPLIERS MAKE NO REPRESENTATIONS ABOUT THE SUITABILITY, RELIABILITY, OR ACCURACY OF THE INFORMATION AND RELATED GRAPHICS CONTAINED HEREIN. ALL SUCH INFORMATION AND RELATED GRAPHICS ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT AND/OR ITS RESPECTIVE SUPPLIERS HEREBY DISCLAIM ALL WARRANTIES AND CONDITIONS WITH REGARD TO THIS INFORMATION AND RELATED GRAPHICS, INCLUDING ALL IMPLIED WARRANTIES AND CONDITIONS OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, WORKMANLIKE EFFORT, TITLE AND NON-INFRINGEMENT. YOU SPECIFICALLY AGREE THAT IN NO EVENT SHALL MICROSOFT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY DIRECT, INDIRECT, PUNITIVE, INCIDENTAL, SPECIAL, CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF USE, DATA OR PROFITS, ARISING OUT OF OR IN ANY WAY CONNECTED WITH THE USE OF OR INABILITY TO USE THE INFORMATION AND RELATED GRAPHICS CONTAINED HEREIN, WHETHER BASED ON CONTRACT, TORT, NEGLIGENCE, STRICT LIABILITY OR OTHERWISE, EVEN IF MICROSOFT OR ANY OF ITS SUPPLIERS HAS BEEN ADVISED OF THE POSSIBILITY OF DAMAGES.