各位达人,我在进入现场后发现才发现了我程序出现内存泄漏,已经花了很长时间不能解决,希望大家给些意见,谢谢了!我跟踪了很久,发现在用ADO读取SQL Server数据库字段时发生了内存泄漏,程序的框架如下,请各位指点:
我采用线程处理接收数据,过程如下:
一、启动线程
pThread=AfxBeginThread(DataRecCheckThread,this);
二、UINT DataRecCheckThread(LPVOID lParam)
{
省略...
pro.DealUDPDelivery(msgrecv.msg,(DWORD)DataLen);//处理接收数据
省略...
return 0;
} 三、//接收数据
void CProtoColMenager::DealUDPDelivery(char* buff, DWORD nLen)
{
省略...
DealwithDB=new CDealwithDB();
DealwithDB->GetSimFrmDb2(str,RtuNo); //从数据库中读取数据字段
delete DealwithDB;
省略...
return;
}
四、
void CDealwithDB::GetSimFrmDb2(CString & tmp_sim,char * RtuNo)
{
CRecordSet* pRecordSet;
char tmp[50]="select sim_num from f_rtubase where rtu_nm =\'";
strcat(tmp, RtuNo);
strcat(tmp,"\'");
pRecordSet=myAdo.CreateRecordSet(tmp);
if(!pRecordSet)
{
pView->PrintInfo("打开数据库失败!",1);
myAdo.DestroyRecordSet(pRecordSet);
}
pRecordSet->GetColVar(&tmp_sim,(int)0);
//一加上这句话后如果接收数据,内存大幅度增加!
tmp_sim.TrimRight(); myAdo.DestroyRecordSet(pRecordSet);
}五、如上所示,如果调用以下函数,接收数据时,内存大幅度泄漏!
BOOL CRecordSet::GetColVar(CString *pStr, int index)
{
VARIANT v;
BOOL rec=GetColValue(&v,index);
*pStr=v.bstrVal;
return rec;
}六、BOOL CRecordSet::GetColValue(VARIANT *pv, int id)
{
Fields* pFields;
Field* pField;
VARIANT vitem;
vitem.vt = VT_I1;
vitem.bVal = id;
HRESULT hr;
try{
hr=m_pRecordSet->get_Fields(&pFields);
hr=pFields->get_Item(vitem,&pField);
hr=pField->get_Value(pv);
}catch (_com_error& e)
{
dump_com_error(e);
return -1;
}
return hr;
}请高手给予指点 ,一定送分到底。
我采用线程处理接收数据,过程如下:
一、启动线程
pThread=AfxBeginThread(DataRecCheckThread,this);
二、UINT DataRecCheckThread(LPVOID lParam)
{
省略...
pro.DealUDPDelivery(msgrecv.msg,(DWORD)DataLen);//处理接收数据
省略...
return 0;
} 三、//接收数据
void CProtoColMenager::DealUDPDelivery(char* buff, DWORD nLen)
{
省略...
DealwithDB=new CDealwithDB();
DealwithDB->GetSimFrmDb2(str,RtuNo); //从数据库中读取数据字段
delete DealwithDB;
省略...
return;
}
四、
void CDealwithDB::GetSimFrmDb2(CString & tmp_sim,char * RtuNo)
{
CRecordSet* pRecordSet;
char tmp[50]="select sim_num from f_rtubase where rtu_nm =\'";
strcat(tmp, RtuNo);
strcat(tmp,"\'");
pRecordSet=myAdo.CreateRecordSet(tmp);
if(!pRecordSet)
{
pView->PrintInfo("打开数据库失败!",1);
myAdo.DestroyRecordSet(pRecordSet);
}
pRecordSet->GetColVar(&tmp_sim,(int)0);
//一加上这句话后如果接收数据,内存大幅度增加!
tmp_sim.TrimRight(); myAdo.DestroyRecordSet(pRecordSet);
}五、如上所示,如果调用以下函数,接收数据时,内存大幅度泄漏!
BOOL CRecordSet::GetColVar(CString *pStr, int index)
{
VARIANT v;
BOOL rec=GetColValue(&v,index);
*pStr=v.bstrVal;
return rec;
}六、BOOL CRecordSet::GetColValue(VARIANT *pv, int id)
{
Fields* pFields;
Field* pField;
VARIANT vitem;
vitem.vt = VT_I1;
vitem.bVal = id;
HRESULT hr;
try{
hr=m_pRecordSet->get_Fields(&pFields);
hr=pFields->get_Item(vitem,&pField);
hr=pField->get_Value(pv);
}catch (_com_error& e)
{
dump_com_error(e);
return -1;
}
return hr;
}请高手给予指点 ,一定送分到底。
解决方案 »
- Static Text 控件闪烁
- 基于WSAEventSelect模型,不是很明白其发送的处理逻辑,请高手指教,谢谢!
- 奇怪的问题!非模态对话框使用WS_CHILD风格生成,在此非模态对话框上的Edit都是无法输入的,请教高手指点。
- 关于sql数据库中日期型字段无法在CRecordView对象中显示的问题。
- 服务端SOCKET怎么知道网络断开?
- 如何将错误信息登录到注册表
- 请问在文本框中(CEdit类)怎么实现换行?
- 多视图文档结构中,如何让其中一个视图占据全部客户区
- 关于:多线程+串口通信
- 怎么解析出SMTP服务器的主机名?
- 完成端口返回错误,错误代码64,伤透了脑筋,这个错误应该怎样解决啊
- 得到满意的offer了 散分! :)
BOOL rec=GetColValue(&v,index);
为什么要用VARIANT呢,,用字节数组不行吗?
hr=pFields->get_Item(vitem,&pField);
都会将Fields* pFields接口addref的,试试relaese它们?