ADO防止内存泄露和减少内存开销的方法

ADO防止内存泄露和减少内存开销的方法

作者:boqing

(自己琢磨的,如果您发现不当之处,望不吝赐教)

 

导读:经常碰到在一个工程中的几个类中都需要调用数据库,因此可考虑编写一个数据库管理类来实现基本的问题,防止内存泄露与不必要的内存开销的几个需要注意的事情:1CreateInstance后不要忘记Release2Open后不要忘记Close3)尽量保证数据管理类只有一个实例。

 

(一)建立一个数据管理类CDataMange,本类只能创建一个实例,具体方法:

l         创建成员变量,私有,静态
private:
     static CDataMange *m_pStatic;

l         在实现文件(*.cpp)中初始化m_pStatic变量
CDataMange *CDataMange::m_pStatic=NULL;

l         创建成员函数,得到m_pStatic。共有,静态
public:

static CWEMange * getInstancePtr(void);

l         实现getInstancePtr函数
CWEMange
* CWEMange::getInstancePtr(void)

{

if (m_pStatic==NULL)

m_pStatic=new CWEMange();

return m_pStatic;

}

(二)在CDataMange类中创建成员
_ConnectionPtr p_Con;

    _RecordsetPtr p_Record;

    _CommandPtr p_Com;

 

(三)构造函数中初始化

CDataMange::CDataMange(void)

{

    HRESULT hr;//0代表成功返回

    hr = p_Con.CreateInstance(__uuidof(Connection));

    if (SUCCEEDED(hr))

        AfxMessageBox(_T("初始化p_Con失败"));

    hr=p_Record.CreateInstance(__uuidof(Recordset));

    if (!SUCCEEDED(hr))

        AfxMessageBox(_T("初始化p_Record失败"));

    ……

}

 

(四)编写一个查询函数

注意:打开记录集后不要忘记关闭

std::vector<CString> CDataMange::getClass(void)

{

    std::vector<CString> str_class;

    _variant_t vtemp;

    try

    {

    p_Record->Open("Class",_variant_t((IDispatch*)p_Con),adOpenStatic,adLockOptimistic,adCmdTable);

        if (p_Record->adoEOF)

            AfxMessageBox(_T("Class无数据"));

    for(p_Record->MoveFirst();!p_Record->adoEOF;p_Record->MoveNext())

        {

            vtemp=p_Record->Fields->Item["class_name"]->Value;

            str_class.push_back(vtemp.bstrVal);

        }

    }

    catch (...)

    {

        CWEMange::getInstance().pushWarningQueue("数据库查询Class目录失败");

        AfxMessageBox(L"数据库查询Class目录失败");

        str_class.clear();

        return str_class;

    }

    if(p_Record->State)

        p_Record->Close();

    return str_class;

}

 

(五)析构函数释放内存

CDataMange::~CDataMange(void)

{

    if (p_Con->State)

        p_Con->Close();

    if(p_Con!=NULL)

        p_Con.Release();

    if(p_Com!=NULL)

        p_Com.Release();

    if (p_Record->State)

        p_Record->Close();

    if(p_Record!=NULL)

        p_Record.Release();

}

 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值