描述:
现在我在解析XML文件的时候,对于重复的一些部分写成了函数进行处理。函数的基本定义如下:
void MyXMLParser::Initialize(IXMLDOMElementPtr& pDOMElement)
其中参数pDOMElement我传递的是一个XML节点的信息,不知这样的传递方式是否正确?智能指针是否需要释放?
解决方案1:
呵呵,俺以为没有什么东西是大错特错,或者大对特对的!
看下边的代码……不包括错误和异常处理
按你所说,返回的智能指针。
执行看起来一切正常,可如果你查看一下引用计数,就知道
_Connection 指针被多引用了一次,且无法释放!
class CMyADO
{
public:
_ConnectionPtr GetConn();
BOOL CloseAndFree();
BOOL Open();
CMyADO();
virtual ~CMyADO();
_ConnectionPtr m_spADOCN;
};
BOOL CMyADO::Open()
{
HRESULT hr;
_bstr_t cn=L"Provider=SQLOLEDB.1;....";
hr=m_spADOCN.CreateInstance (L"ADODB.Connection");
m_spADOCN->Open(cn,"","",adConnectUnspecified);
return true;
}
BOOL CMyADO::CloseAndFree()
{
m_spADOCN->Close;
m_spADOCN.Release ();
return true;
}
_ConnectionPtr CMyADO::GetConn()
{
return m_spADOCN;
}
int main(int argc, char* argv[])
{
CoInitialize(NULL);
_variant_t vx;
CMyADO myAdo;
myAdo.Open();
IDispatch* pDisp=NULL;
myAdo.GetConn()->QueryInterface (IID_IDispatch,(void**)&pDisp);
pDisp->Release ();
myAdo.CloseAndFree ();
CoUninitialize();
return 0;
}
返回对象指针只能使用只能指针,用原生指针是大错特错。
解决方案3: 跨函数传递对象,俺建议使用原生指针,不用智能指针,
你跟踪一下调用函数就知道为什么了
另外的建议,如果你有函数要返回对象指针,那么也建议使用原生指针。
俺在这上边吃过许多苦头
用IXMLDOMElementPtr&,IXMLDOMElementPtr,IXMLDOMElement*传都可以,都不需要释放指针。IXMLDOMElement*效率高一些。
解决方案5: You are right.
No need to release smart pointer.