访问数据库出现内存泄露问题
以下这段代码有内存泄露,我找了几天,就是没有方法解决。希望有高手能帮忙。
这个函数运行每2000次左右会吃掉1M左右内存。
void CViewUsers::RunSQL(CString sql,int nPages, int iUserAction, int nType)
{
_RecordsetPtr m_pRecordset;
_ConnectionPtr m_pConnection;
HRESULT hr;
try
{
hr = m_pConnection.CreateInstance("ADODB.Connection");///创建Connection对象
if(SUCCEEDED(hr))
{
hr = m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=sysDB.mdb","","",adModeUnknown);///连接数据库
}
}
catch(_com_error e)///捕捉异常
{
CString errormessage;
errormessage.Format("连接数据库失败!\r\n错误信息:%s",e.ErrorMessage());
return;
}
//m_list_data 是 CListCtrl m_list_data;
//清空列表框的内容
m_list_data.DeleteAllItems();
while(m_list_data.DeleteColumn(0))
{}
m_pRecordset.CreateInstance("ADODB.Recordset");
m_pRecordset->Open(_bstr_t(sql),_variant_t((IDispatch*)m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);
_variant_t var;
CString temp;
try
{
//查看用户
m_list_data.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);//
m_list_data.InsertColumn(0,_T("ID"),LVCFMT_IMAGE|LVCFMT_LEFT);
m_list_data.InsertColumn(1,_T("姓名"));
m_list_data.InsertColumn(2,_T("性别"));
int j;
for(j=0;j<3;j++)
{
m_list_data.SetColumnWidth(j ,90);
}
int nCount=0;
m_pRecordset->MoveFirst();
while(!m_pRecordset->adoEOF)
{
nCount++;
m_pRecordset->MoveNext();
}
m_pRecordset->MoveFirst();
while(!m_pRecordset->adoEOF)
{
temp="";
var=m_pRecordset->GetCollect("userID");
if(var.vt != VT_NULL)
temp=(LPCSTR)_bstr_t(var);
int nItem = m_list_data.InsertItem(m_list_data.GetItemCount(),temp);
temp="";
var=m_pRecordset->GetCollect("userName");
if(var.vt != VT_NULL)
temp=(LPCSTR)_bstr_t(var);
m_list_data.SetItemText(nItem,1,temp);
temp="";
var=m_pRecordset->GetCollect("Sex");
if(var.vt != VT_NULL)
temp=(LPCSTR)_bstr_t(var);
m_list_data.SetItemText(nItem,2,temp);
m_pRecordset->MoveNext();
}
//关闭记录集
m_pRecordset->Close();
m_pConnection->Close();
m_pRecordset=NULL;
m_pConnection= NULL;
}
catch(_com_error e)///捕捉异常
{
AfxMessageBox("读取数据库失败!");///显示错误信息
}
}