ADO||ADOX智能指针Release问题

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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值