您的位置:首页 > 其它

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

2007-11-15 10:52 281 查看

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

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

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

(一)建立一个数据管理类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();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: