最近在开发一个打印伺服,结果测试时发现程序会不停地泄露内存,每秒能泄露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,该函数只是将该智能指针指向的地址置空,并不释放其指向地址的内存,所以如果程序不停的地调用,内存会不停的泄露,这就是原因。
此次的代码应该