Düzeltme: Bellek sızıntısı ADO Recordset veya komutlar Toplama'ya neden olabilir

Makale çevirileri Makale çevirileri
Makale numarası: 283106 - Bu makalenin geçerli olduğu ürünleri görün.
Bu makale arşivlenmiştir. "Olduğu gibi" sunulmaktadır ve bundan sonra güncelleştirilmeyecektir.
Hepsini aç | Hepsini kapa

Bu Sayfada

Belirtiler

ActiveX Data Objects (ADO) kayıt kümesi veya Command nesnesi, Visual C++ uygulama ya da devingen bağlantı kitaplığı (DLL) toplayan, önemli bir bellek sızıntısı nedeniyle kaynaklarına nesne üzerinde yayın işlevi çağrıldığında, serbest değil oluşabilir.

Bu tüm ADO'ın önceki sürümleri de dahil sürüm 2.6 RTM (2.60.6526) oluşur.

Neden

Toplama, Recordset ve Command nesneleri Active Template Library (ATL) CComAggObject sınıfları kullanılarak uygulanır. Kendi başvuru sayısı sıfır olarak gider ve yalnızca bir Command nesnesi ve Recordset siler CComAggObject kendisini siler. Recordset veya Command nesnesinin süresi işlevi hiçbir zaman, temizleme tahsis edilen kaynakların oluştuğu olduğu çağrılır.

Çözüm

MDAC

Bu sorunu gidermek için <a0></a0>, Microsoft, MDAC 2.5 için en son hizmet paketini edinin. Ek bilgi için, Microsoft Bilgi Bankası'ndaki makaleyi görüntülemek üzere aşağıdaki makale numarasını tıklatın:
293312BILGI: son MDAC 2.5 nasıl elde edilir hizmet paketi
Bu sorun, Microsoft Data Access Components 2.6 Service Pack 1 düzeltilmiştir.
Ek bilgi için, Microsoft Bilgi Bankası'ndaki makaleyi görüntülemek üzere aşağıdaki makale numarasını tıklatın:
300635BILGI: son MDAC 2.6) nasıl elde edilir hizmet paketi
Bu düzeltmenin İngilizce sürümünde aşağıdaki dosya öznitelikleri veya üstü bulunur:

MDAC 2.5
   Date          Version        Size             File name
   ------------------------------------------------------------
   12/14/2000    2.53.6013.0     20,480 bytes    Msader15.dll	
   12/14/2000    2.53.6013.0    491,792 bytes    Msado15.dll	
   12/14/2000    2.53.6013.0    172,304 bytes    Msadomd.dll	
   12/14/2000    2.53.6013.0     57,616 bytes    Msador15.dll	
   12/14/2000    2.53.6013.0    188,688 bytes    Msadox.dll	
   12/14/2000    2.53.6013.0     57,616 bytes    Msadrh15.dll	   	
   12/14/2000    2.53.6013.0     94,480 bytes    Msjro.dll	
   12/22/2000                   824,744 bytes    Q283106_w2k_sp3_x86_en.exe
				

Durum

MDAC

Microsoft, bu makalenin başında listelenen Microsoft ürünlerinde bir sorun olduğunu onaylamıştır. Bu sorun ilk olarak Microsoft MDAC 2.5 Service Pack 3'te giderilmiştir.Bu sorun ilk olarak Microsoft Data Access Components 2.6 Service Pack 1 giderilmiştir.

WINDOWS 2000

Microsoft, bu makalenin başında listelenen Microsoft ürünlerinde bir sorun olduğunu onaylamıştır.

Daha fazla bilgi

Bu davranış, Visual C++, ve Geliştirici Recordset veya Command nesnesi kasıtlı olarak toplayan, uygulamayı yalnızca yazıldı, görüntülenmesine izin olasıdır. Toplama Visual Basic'den mümkün olmadığı için Microsoft Visual Basic uygulamalarında, bu davranış oluşmaz.

Bu düzeltmenin MDAC 2.5 sürüm 2.5 RTM (2.50.4403) ve 2.5 SP1 üzerinde uygulanabilir (2.50.5303).

Davranışı yeniden oluşturma adımları

  1. Yeni Visual C++ konsol uygulaması, aşağıdaki kodu yapıştırın ve sonra derleyip kodu çalıştırın.
    #include "objbase.h"
    #import "c:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename( "EOF", "adoEOF" )
    
    struct InitOle {
      InitOle()  { ::CoInitialize(NULL); }
      ~InitOle() { ::CoUninitialize();   }
    } _init_InitOle_; 
    
    
    
    class MyClass : public IUnknown
    {
    public:
    	MyClass()
    	{
    		m_refCount = 0;
    	}
    
    	STDMETHODIMP_(ULONG) AddRef()
      {
    		m_refCount++;
    		return m_refCount;
      }
    
    	STDMETHODIMP_(ULONG) Release()
    	{
    		m_refCount--;
    		return m_refCount;
      }
    
    	STDMETHODIMP QueryInterface(REFIID riid, void **ppv)
    	{
    		if (riid == IID_IUnknown) {
    			*ppv = static_cast<IUnknown *> (this);
    			AddRef();
    			return S_OK;
    		}
    
    		return E_NOINTERFACE;
    	}
    
    private:
    	ULONG m_refCount;	
    };
    
    
    int main(int argc, char* argv[])
      {
    	MyClass cls;
    	HRESULT hr;
    	IUnknown *pUnkInner;
    
    	CoInitialize(NULL);
    	cls.AddRef();
    
    	for (int i=0; i<10000; i++)
    	{
    		//while (true) {
    		pUnkInner = NULL;
    		hr = CoCreateInstance(__uuidof(Recordset), &cls, CLSCTX_INPROC_SERVER, IID_IUnknown,
    			(void **) &pUnkInner);
    		pUnkInner->Release();
    	}
    	return 0;
    }
    					
  2. Performans izleyicisi'ni başlatın ve yürütülebilir'ın çalışması için özel bayt sayacı seçin. Tahsis edilen artan miktarda bellek yok not hiç serbest.

Özellikler

Makale numarası: 283106 - Last Review: 24 Şubat 2014 Pazartesi - Gözden geçirme: 3.2
Bu makaledeki bilginin uygulandığı durum:
  • Microsoft ActiveX Data Objects 2.0
  • Microsoft ActiveX Data Objects 2.1
  • Microsoft ActiveX Data Objects 2.5
  • Microsoft ActiveX Data Objects 2.6
  • Microsoft Data Access Components 2.0
  • Microsoft Data Access Components 2.1
  • Microsoft Data Access Components 2.5
  • Microsoft Data Access Components 2.6
  • 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: 
kbnosurvey kbarchive kbmt kbhotfixserver kbqfe kbmdac250sp3fix kbbug kbfix kbmdac260sp1fix KB283106 KbMttr
Machine-translated Article
Ö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:283106

Geri Bildirim Ver

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com