vc ado 内存泄露

最近在开发一个打印伺服,结果测试时发现程序会不停地泄露内存,每秒能泄露1m内存,1m 啊兄弟们,我头疼了,于是到处上网去搜,有的说你的连接未释放,有的说ado本身有问题,有的说是_bStr_内存没释放,结果发现是调用存储过程的_CommandPtr没有release。

先看代码:

try
			{
				_CommandPtr m_pCommand;
				m_pCommand.CreateInstance(__uuidof(Command));
				m_pCommand->ActiveConnection = m_pSqlConnect.GetHandle();
				m_pCommand->CommandType = adCmdStoredProc;
				m_pCommand->CommandText = _bstr_t(_T("GenerateCCPrintTask"));
				
				_variant_t vNull;
				vNull.vt=VT_ERROR;
				vNull.scode=DISP_E_PARAMNOTFOUND;

				m_pCommand->Execute(&vNull,&vNull,adCmdStoredProc);
				m_pCommand.Detach();
			}
			catch (_com_error &error)
			{
				CString errorMsg;
				errorMsg.Format(_T("执行存储过程GenerateCCPrintTask异常,错误为:%s"),error.ErrorMessage());

				AfxMessageBox(errorMsg);
			}
事实上,这块代码我是从网上弄下来的,所以也没深入研究就用起来了,这是一个调用存储过程的ado代码。问题就出在_CommandPtr Detach,该函数只是将该智能指针指向的地址置空,并不释放其指向地址的内存,所以如果程序不停的地调用,内存会不停的泄露,这就是原因。

此次的代码应该为:

m_pCommand.Release();

此次解决这一类bug,我觉得还是得用代码块定位的方法,先将你怀疑的代码注释掉,如果内存不再泄露了,那问题就出在注释的那块代码那里,然后一步一步地缩小包围圈。



你可能感兴趣的:(vc ado 内存泄露)