Win server 2008 Ado 内存泄露

wulathink 2014-07-31 10:35:14
我正在写一个程序需要在win server 2008下频繁使用ADO访问SQL server 进行数据的更新、查询等操作。但是我发现每次使与SQL交互时程序使用的内存都会增长,相关代码如下:
BOOL CAdoDB::ExecuteSQL(string strSQL, string &strError,BOOL bTrans)
{
if(strSQL.empty())
{
strError="SQL字符串不能为空!";
return FALSE;
}
if(m_pCON==NULL)
{
if(!IsOpen())
{
strError="打开连接失败! NULL";
return FALSE;
}
}else if (m_pCON->GetState()!=adStateOpen)
{
if(!IsOpen())
{
strError="打开连接失败! not adStateOpen";
return FALSE;
}
}
_variant_t rstAffected;
BSTR _bstrSQL;

try
{
_bstrSQL=_com_util::ConvertStringToBSTR(strSQL.c_str());
if(bTrans)
m_pCON->BeginTrans();

m_pCON->Execute(_bstrSQL,&rstAffected,adCmdText);

if(bTrans)
m_pCON->CommitTrans();

SysFreeString(_bstrSQL);
}
catch (_com_error &e)
{
SysFreeString(_bstrSQL);

if(bTrans)
m_pCON->RollbackTrans();
if(m_pCON->GetState()==adStateOpen)
m_pCON->Close();
strError=(LPCSTR)e.Description();
return FALSE;
}
return TRUE;
}


ReleaseCON()
{
try
{
if(m_pCMD!=NULL)
{
m_pCMD->Release();
m_pCMD=NULL;
}
}
catch(_com_error &e)
{
e.Description();
}

if(m_pCON!=NULL)
{
try
{
if(m_pCON->State!=adStateClosed)
{
m_pCON->Close();
m_pCON.Release();
}
m_pCON=NULL;
}
catch(_com_error &e)
{
e.Description();
}
}
if(m_pRCD!=NULL)
{
try
{
if(m_pRCD->State!=adStateClosed)
{
m_pRCD->Close();
m_pRCD.Release();
}
m_pCON=NULL;
}
catch(_com_error &e)
{
e.Description();
}
}
}


每次执行完execute之后都会执行release函数。请问是我代码的问题吗?还是真的ADO问题呢?

微软官网上http://support.microsoft.com/kb/283106/zh-cn也有关于内存泄露的文档,但是好像不适合我的情况,因为我的是WIN SERVER 2008
...全文
89 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
wulathink 2014-07-31
  • 打赏
  • 举报
回复
引用 1 楼 lovesmiles 的回复:
不是很了解Ado.说下几个觉得可能有问题的地方:

       try
        {
            if(m_pCON->State!=adStateClosed)
            {
                m_pCON->Close();//要是这里抛出异常,下面的释放代码岂不是不能执行?
                m_pCON.Release();
            }
            m_pCON=NULL;
        }
        catch(_com_error &e)  
        {
            e.Description();
        }
 catch (_com_error &e)
    {//要是异常不是_com_error ,这个FreeString是不是也不能执行到?
        SysFreeString(_bstrSQL);
有道理,我试下
勤奋的小游侠 2014-07-31
  • 打赏
  • 举报
回复
不是很了解Ado.说下几个觉得可能有问题的地方:

       try
        {
            if(m_pCON->State!=adStateClosed)
            {
                m_pCON->Close();//要是这里抛出异常,下面的释放代码岂不是不能执行?
                m_pCON.Release();
            }
            m_pCON=NULL;
        }
        catch(_com_error &e)  
        {
            e.Description();
        }
 catch (_com_error &e)
    {//要是异常不是_com_error ,这个FreeString是不是也不能执行到?
        SysFreeString(_bstrSQL);

64,281

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧