ADO||ADOX智能指针释放问题
示例1:
CoInitialize(NULL);// 初始化com组件
ADOX::_CatalogPtr pCatalog(__uuidof(ADOX::Catalog));
strConnect.Format(_T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s"), strDBPath);
COleVariant Connect(strConnect);
pCatalog.CreateInstance(_T("ADOX.Catalog"));
pCatalog->Create((LPCTSTR)strConnect);//创建数据库
pCatalog->Tables->Refresh();//刷新
pCatalog->Release();
CoUninitialize();//释放com组件
运行结果:
抛出异常
错误指向:
// Releases only if the interface is not null.
// The interface is not set to NULL.
//
void _Release() throw()
{
if (m_pInterface != NULL) {
m_pInterface->Release();
}
}
示例2:
CoInitialize(NULL);// 初始化com组件
ADOX::_CatalogPtr pCatalog(__uuidof(ADOX::Catalog));
strConnect.Format(_T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s"), strDBPath);
COleVariant Connect(strConnect);
pCatalog.CreateInstance(_T("ADOX.Catalog"));
pCatalog->Create((LPCTSTR)strConnect);//创建数据库
pCatalog->Tables->Refresh();//刷新
pCatalog.Release();
CoUninitialize();//释放com组件
运行结果:
运行正常
示例1和示例2的区别在于:pCatalog->Release();和pCatalog.Release();
pCatalog.Release()调用的函数如下,
void Release()
{
if (m_pInterface == NULL) {
_com_issue_error(E_POINTER);
}
else {
m_pInterface->Release();
m_pInterface = NULL;
}
}
从上分析可知:
1)pCatalog.Release()会调用 m_pInterface->Release();
2)pCatalog->Release()也会调用m_pInterface->Release();
3)但直接调用->release会崩溃,主要是pCatalog->Release()释放的是智能指针的对象及其所有
4)pCatalog.Release()执行的是释放方法
总结:
1)如果想正确释放智能指针及其内存,需要调用ptr.release(),而不是ptr->release();
2)智能指针会自行管理释放,强制释放会引起异常,在使用过程中,可以不执行release操作。
3)ADOX和ADODB中的智能指针释放方法同上,需采用ptr.release()