ID do artigo: 167929 - Última revisão: terça-feira, 21 de novembro de 2006 - Revisão: 4.1

Vazamentos de memória são relatados quando você usar várias DLLs de MFC

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 | Recolher tudo

Sintomas

Quando você depurar um projeto que contém o MFC regulares (USRDLL) DLLs ou ActiveX Controls (OCX), você verá vazamentos de memória semelhante à seguinte relatado no depurador:
   a CDynLinkLibrary object at $00410F70, 64 bytes long
   a CDynLinkLibrary object at $00410F70, 64 bytes long
   {38} client block at 0x00410D80, subtype 0, 64 bytes long.
   a CDynLinkLibrary object at $00410D80, 64 bytes long
   a CDynLinkLibrary object at $00410D80, 64 bytes long
   {36} client block at 0x00410C60, subtype 0, 64 bytes long.
   a CDynLinkLibrary object at $00410C60, 64 bytes long
   a CDynLinkLibrary object at $00410C60, 64 bytes long
				

Causa

Esses vazamentos de memória são relatados quando várias versões de DLL MFC são carregados no mesmo processo. Como DLLs de extensão (AFXDLL) MFC exigem a mesma DLL de MFC exata como o aplicativo de chamada, esse problema pode ocorrer somente quando usando controles de ActiveX (OCX) que usam a versão compartilhada do MFC ou DLLs do MFC regulares (USRDLL).

O caso mais comum é mistura (MFC4xd.DLL) ANSI e UNICODE (MFC4xxUd.DLL) versões do MFC no mesmo processo. Isso também pode ocorrer quando mistura MFC42d.DLL e MFC40d.DLL.

Resolução

Essas notificações de vazamento de memória são falsos e podem ser ignoradas. Como nenhuma cópia do MFC conhece os outros, não é fácil interromper esses falsos vazamentos de sendo informado. No entanto, é possível separar vazamentos falsos dos possíveis vazamentos reais. Isso pode ser feito substituindo CWinApp::ExitInstance() no EXE e DLL e colocando instruções TRACE() neles:
   int CTestDllApp::ExitInstance()
   {
      TRACE(_T("ExitInstance() for regular DLL: TESTDLL\n"));

      return CWinApp::ExitInstance();
   }
				
somente os vazamentos de memória que são detectados depois que o último CWinApp::ExitInstance() é chamado são vazamentos de memória true.

Situação

Esse comportamento é por design.

Mais Informações

Considere as seguintes aplicativo/DLLs:
     -------------               --------------
     =           =               =            =
     =   MFC     =    Calls      =    MFC     =
     =   APP     = ------------> =   USRDLL   =
     =           =               =            =
     =           =               =            =
     -------------               --------------
           |                           |
           |                           |
           | Calls                     | Calls
           |                           |
           \/                         \/ 
     -------------               --------------
     =           =               =            =
     =           =               =            =
     =   MFC40d  =               =   MFC40Ud  =
     =    DLL    =               =    DLL     =
     =           =               =            =
     -------------               --------------
                \                 / 
                 \               / 
                  \ Calls       / Calls
                   \           / 
                   \/         \/ 
                   -------------
                   =           =
                   =           =
                   =  MSVCR40d =
                   =   (CRT)   =
                   =           =
                   -------------
				
o aplicativo MFC que é criado com a versão ANSI (MFC40d.DLL) do MFC chama USRDLL o MFC, o que é criado com a versão UNICODE (MFC40Ud.DLL) do MFC. Ambas as versões MFC usam a mesma C run-time (CRT) DLL, MSVCR40d.DLL. Como MFC USRDLLs são "caixas pretas", deve haver problemas com chamar um USRDLL de MFC UNICODE de um aplicativo do MFC ANSI.

No entanto, desde o UNICODE (MFC40ud.DLL) e DLLs do MFC ANSI (MFC40d.DLL) usam a mesma DLL CRT, vazamentos de memória falso são relatados em todos os objetos alocados em USRDLL MFC. Isso ocorre porque MFC depende a DLL de CRT para alocar e controlar toda a memória. Ele não separa as alocações de memória de diferentes versões do MFC. Quando uma das DLLs MFC descarrega, ele chama a CRT para fazer um despejo de memória, supondo que tudo deixado no heap é um vazamento de memória. No entanto, essa suposição é incorreta como há dois várias cópias do MFC na memória.

(c) 1997 Microsoft Corporation, todos os direitos reservados. Contribuições de Kelly Marie Ward, Microsoft Corporation.

A informação contida neste artigo aplica-se a:
  • Microsoft Foundation Class Library 4.2 nas seguintes plataformas
    • Microsoft Visual C++ 4.0 Standard Edition
    • Microsoft Visual C++ 4.1 Subscription
    • Microsoft Visual C++ 4.2 Enterprise Edition
    • Microsoft Visual C++ 4.2 Professional Edition
    • Microsoft Visual C++ 5.0 Enterprise Edition
    • Microsoft Visual C++ 5.0 Professional Edition
    • Microsoft Visual C++ 6.0 Enterprise Edition
    • Microsoft Visual C++ 6.0 Professional Edition
    • Microsoft Visual C++, 32-bit Learning Edition 6.0
Palavras-chave: 
kbmt kbtshoot kbdll kbprb KB167929 KbMtpt
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 traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 167929  (http://support.microsoft.com/kb/167929/en-us/ )