Artigo: 167929 - Última revisão: terça-feira, 21 de Novembro de 2006 - Revisão: 4.1

Fugas de memória são comunicadas quando utiliza 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 | Reduzir tudo

Sintomas

Quando depura um projecto que contém MFC normal (USRDLL) dll ou controlos ActiveX (OCX), poderá ver fugas de memória semelhante à seguinte 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

Estes fugas de memória são comunicadas quando múltiplas versões da DLL MFC são carregados no mesmo processo. Uma vez que as DLL de extensão (AFXDLL) MFC requer a DLL de MFC mesmo exactamente como a aplicação de chamada, este problema só pode ocorrer quando utilizar MFC normal (USRDLL) dll ou controlos ActiveX (OCX) que utilizam a versão do MFC partilhada.

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

Resolução

Estas notificações de fuga de memória são falsas e podem ser ignoradas. Uma vez que nenhuma cópia do MFC conhece outros diferentes, é não fácil parar estes falsas fugas de que está a ser comunicado. No entanto, é possível separar fugas falsas de fugas de VERDADEIRO potenciais. Pode fazê-lo substituir CWinApp::ExitInstance() na EXE e DLL e colocando TRACE() instruções os:
   int CTestDllApp::ExitInstance()
   {
      TRACE(_T("ExitInstance() for regular DLL: TESTDLL\n"));

      return CWinApp::ExitInstance();
   }
				
só as fugas de memória são detectadas depois do último CWinApp::ExitInstance() é chamado são fugas de memória true.

Ponto Da Situação

Este comportamento ocorre por predefinição.

Mais Informação

Considere as seguintes aplicações/DLLs:
     -------------               --------------
     =           =               =            =
     =   MFC     =    Calls      =    MFC     =
     =   APP     = ------------> =   USRDLL   =
     =           =               =            =
     =           =               =            =
     -------------               --------------
           |                           |
           |                           |
           | Calls                     | Calls
           |                           |
           \/                         \/ 
     -------------               --------------
     =           =               =            =
     =           =               =            =
     =   MFC40d  =               =   MFC40Ud  =
     =    DLL    =               =    DLL     =
     =           =               =            =
     -------------               --------------
                \                 / 
                 \               / 
                  \ Calls       / Calls
                   \           / 
                   \/         \/ 
                   -------------
                   =           =
                   =           =
                   =  MSVCR40d =
                   =   (CRT)   =
                   =           =
                   -------------
				
a aplicação de MFC baseia-se com a versão ANSI (MFC40d.DLL) do MFC chama o USRDLL MFC, que é criado com a versão UNICODE (MFC40Ud.DLL) do MFC. Ambas as versões MFC utilizam a mesma C run-time (CRT) DLL, MSVCR40d.DLL. Uma vez que MFC USRDLLs são "caixas pretas", deverá existir existem problemas com chamar um USRDLL de MFC UNICODE a partir de uma aplicação de MFC ANSI.

No entanto, desde o UNICODE (MFC40ud.DLL) e DLL de MFC ANSI (MFC40d.DLL) utilizam a mesma DLL CRT, fugas de memória FALSO são reportadas em todos os objectos atribuídos em USRDLL MFC. Isto ocorre porque o MFC depende da DLL de CRT para atribuir e controlar toda a memória. -Não separe as atribuições de memória a partir das diferentes versões do MFC. Quando uma das DLLs MFC descarrega, chama CRT para efectuar uma cópia de memória, assumindo que está tudo deixada na pilha de uma fuga de memória. No entanto, este pressuposto está incorrecto uma vez que existem dois várias cópias do MFC na memória.

(c) 1997 Microsoft Corporation, todos os direitos reservados. Contribuições de Joana Maria 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 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). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 167929  (http://support.microsoft.com/kb/167929/en-us/ )