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

Ö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.

283106
Bu makale arşivlenmiştir. "Olduğu gibi" sunulmaktadır ve bundan sonra güncelleştirilmeyecektir.
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.
kayıtkümesi komut bellek sızıntısı toplama toplama cocreateinstance

Uyarı: Bu makalenin çevirisi otomatik olarak yapılmıştır

Özellikler

Makale No: 283106 - Son İnceleme: 02/24/2014 12:43:05 - Düzeltme: 3.2

  • 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
  • kbnosurvey kbarchive kbmt kbhotfixserver kbqfe kbmdac250sp3fix kbbug kbfix kbmdac260sp1fix KB283106 KbMttr
Geri bildirim