修复: 将 ADO 记录集或命令可能导致内存泄漏

文章翻译 文章翻译
文章编号: 283106 - 查看本文应用于的产品
本文已归档。它按“原样”提供,并且不再更新。
展开全部 | 关闭全部

本文内容

症状

如果 Visual c + + 应用程序或动态链接库 (DLL) 聚合 ActiveX 数据对象 (ADO) 记录集命令 对象,可能会很大的内存泄漏导致,在对象上调用 发布 功能时不释放资源。

发生这种情况在所有 ADO 之前的版本和包括的版本中 2.6 RTM (2.60.6526)。

原因

记录集命令 对象中的聚合是通过使用活动模板库 (ATL) 中的 CComAggObject 类实现的。CComAggObject 删除本身时其引用计数零,并只需删除 Recordset 或也 Command 对象。永远不会调用 记录集命令 对象的 词汇 函数,即出现在清理的已分配资源的位置。

解决方案

MDAC

若要解决此问题,获得最新的 service pack,对于 Microsoft MDAC 2.5。有关更多的信息请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
293312信息: 如何获取最新 MDAC 2.5 服务包
Microsoft 数据访问组件 2.6 Service Pack 1 中,此问题已得到纠正。
有关更多的信息请单击下面文章编号,以查看 Microsoft 知识库中相应的文章:
300635信息: 如何获取最新 MDAC 2.6 服务包
此修复程序的英文版应具有以下文件属性或更高版本:

2.5 MDAC
   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
				

状态

MDAC

Microsoft 已经确认这是在本文开头列出的 Microsoft 产品中的问题。Microsoft MDAC 2.5 Service Pack 3 中,第一次已得到纠正此问题。Microsoft 数据访问组件 2.6 Service Pack 1 中,第一次已得到纠正此问题。

Windows 2000

Microsoft 已经确认这是在本文开头列出的 Microsoft 产品中的问题。

更多信息

这种行为很可能只有已写入应用程序,Visual 的 c + + 中,开发人员故意聚合 Recordset命令 对象时,会看到。在 Microsoft Visual Basic 的应用程序中的此行为不会发生,因为不可能从 Visual Basic 聚合。

可以通过 2.5 RTM (2.50.4403) 和 2.5 SP1 应用此修补程序的 MDAC 2.5 版本 (2.50.5303)。

重现行为的步骤

  1. 将以下代码粘贴到新的 Visual c + + 控制台应用程序,然后编译并运行代码
    #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. 启动性能监视器,然后选择专用字节数计数器的可执行文件运行。请注意,没有分配的内存的不断增加量,永远不会被释放。

属性

文章编号: 283106 - 最后修改: 2014年2月24日 - 修订: 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 企业版
  • Microsoft Visual C++ 6.0 专业版
  • Microsoft Visual C++, 32-bit Learning Edition 6.0
关键字:?
kbnosurvey kbarchive kbmt kbhotfixserver kbqfe kbmdac250sp3fix kbbug kbfix kbmdac260sp1fix KB283106 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 283106
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

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