Makale numarası: 167929 - Son Gözden Geçirme: 21 Kasım 2006 Salı - Gözden geçirme: 4.1

Birden çok MFC dll kullandığınızda bellek sızıntıları bildirilir

Sistem İpucuBu makale, kullandığınızdan farklı bir işletim sistemine yöneliktir. Sizinle ilgili olmayabilecek makale içeriği devre dışı bırakıldı.
Hepsini aç | Hepsini kapa

Belirtiler

MFC normal (USRDLL) dll veya ActiveX denetimi (OCX) içeren bir proje hata, hata ayıklayıcıda bildirilen bellek sızdırıyor aşağıdakine benzer görebilirsiniz:
   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
				

Neden

Aynı işlem içinde birden çok sürümü MFC DLL'nin yüklendiğinde, bu bellek sızıntıları raporlanır. MFC (AFXDLL) uzantısı DLL arama uygulaması tam olarak aynı MFC DLL gerekir çünkü yalnızca MFC normal (USRDLL) dll veya ActiveX denetimi (MFC paylaştırılmış bir sürümünü kullanan OCX) Bu sorun oluşabilir.

En yaygın durum <a1>ANSI</a1> (MFC4xd.DLL) ve MFC <a1>UNICODE</a1> (MFC4xxUd.DLL) sürümleri aynı işlemde karıştırma olur. Bu da MFC42d.DLL ve MFC40d.DLL oluşabilir.

Çözüm

Bu bellek sızıntısı bildirimleri yanlış; sayılabilir. Diğer sürücüler hakkında her iki kopyası MFC biliyor olduğundan, bu yanlış sızıntılarını, rapor gelen durdurmak kolay değildir. Ancak, yanlış sızıntıları gerçek bir olası sızıntıları ayırmak mümkündür. Bu CWinApp::ExitInstance() EXE ve DLL geçersiz kılma ve TRACE() ifadeleri bunları yerleştirme yapılabilir:
   int CTestDllApp::ExitInstance()
   {
      TRACE(_T("ExitInstance() for regular DLL: TESTDLL\n"));

      return CWinApp::ExitInstance();
   }
				
gerçek bellek sızıntısı algılandığında, son CWinApp::ExitInstance() çağırıldıktan sonra bellek sızıntısı olan yalnızca.

Durum

Bu davranış tasarım yüzündendir.

Daha fazla bilgi

Aşağıdaki uygulama/dll göz önünde bulundurun:
     -------------               --------------
     =           =               =            =
     =   MFC     =    Calls      =    MFC     =
     =   APP     = ------------> =   USRDLL   =
     =           =               =            =
     =           =               =            =
     -------------               --------------
           |                           |
           |                           |
           | Calls                     | Calls
           |                           |
           \/                         \/ 
     -------------               --------------
     =           =               =            =
     =           =               =            =
     =   MFC40d  =               =   MFC40Ud  =
     =    DLL    =               =    DLL     =
     =           =               =            =
     -------------               --------------
                \                 / 
                 \               / 
                  \ Calls       / Calls
                   \           / 
                   \/         \/ 
                   -------------
                   =           =
                   =           =
                   =  MSVCR40d =
                   =   (CRT)   =
                   =           =
                   -------------
				
MFC MFC <a1>ANSI</a1> (MFC40d.DLL) sürümü ile oluşturulmuş uygulama MFC <a1>UNICODE</a1> (MFC40Ud.DLL) sürümü ile oluşturulmuş MFC USRDLL çağırır. Her iki MFC sürümü aynı C çalışma zamanı (CRT) DLL, MSVCR40d.DLL kullanın. MFC USRDLLs "siyah kutular" olduğundan, bir ANSI MFC Uygulaması ' bir UNICODE MFC USRDLL arama ile hiçbir sorun olmalıdır.

Ancak <a1>UNICODE</a1> (MFC40ud.DLL) ve <a1>ANSI</a1> (MFC40d.DLL) MFC dll itibaren her ikisi de aynı CRT DLL kullanır yanlış bir bellek sızıntısı MFC USRDLL tahsis edilen tüm nesnelerin raporlanır. Bu, MFC ayırmak ve tüm belleğe izlemek için CRT DLL olduğundan oluşur. Bunu MFC farklı sürümlerindeki bellek ayırmalarını ayrı değil. MFC dll herhangi birini kaldırır, bağlı olan her şeyi yığın içinde kalan bir bellek sızıntısı olduğu varsayılarak, bir bellek dökümü yapmak için bu CRT çağırır. Var olduğundan iki ancak bu varsayımı geçersiz MFC bellek içinde birden çok kopyası.

(c) 1997 Microsoft Corporation, tüm hakları saklıdır. Katkıyı Kelly Başak Ward, Microsoft Corporation.

Bu makaledeki bilginin uygulandığı durum:
  • Microsoft Foundation Class Library 4.2, Ne zaman ne ile kullanilir:
    • Microsoft Visual C++ 4.0 Standard Edition
    • Microsoft Visual C++ 4.1 Aboneliği
    • 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
Anahtar Kelimeler: 
kbmt kbtshoot kbdll kbprb KB167929 KbMttr
Otomatik TercümeOtomatik Tercüme
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:167929  (http://support.microsoft.com/kb/167929/en-us/ )