现在我在解析XML文件的时候,对于重复的一些部分写成了函数进行处理。函数的基本定义如下:
void MyXMLParser::Initialize(IXMLDOMElementPtr& pDOMElement)
其中参数pDOMElement我传递的是一个XML节点的信息,不知这样的传递方式是否正确?智能指针是否需要释放?
void MyXMLParser::Initialize(IXMLDOMElementPtr& pDOMElement)
其中参数pDOMElement我传递的是一个XML节点的信息,不知这样的传递方式是否正确?智能指针是否需要释放?
解决方案 »
- dll动态库中创建窗口,为何不能用this ?
- 关于bmp文件无对话框弹出的保存问题
- 想学ATL,不知道怎么入手,请教。
- 什么是回调函数,它和一般的函数有什么差别?
- 我连这些问题都不知道,大家鼓励鼓励!!!
- TCHAR(*lpszColumn)[50]=NULL是什么意思?
- lionelyao请来领分
- 如何在richedit中显示jpeg图片.有可能吗????
- 哪位有Microsoft VisualStudio.NET 7.0的序列號?
- 有人能告诉我3dmax和vc的最家结合点是什么吗???
- 怎样可以逐行调试用VC写的COM。一个很简单的问题,在线等待。
- 我要把MAINFRAME中打开的数据库变量传递到弹出对话框中,
按你所说,返回的智能指针。
执行看起来一切正常,可如果你查看一下引用计数,就知道
_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;
}
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;
}如果你返回的是原生指针,那才是真的没有机会去释放了。
{ CMyADO myAdo;
myAdo.Open();
IDispatch* pDisp=NULL;
myAdo.GetConn()->QueryInterface (IID_IDispatch,(void**)&pDisp);
pDisp->Release ();
myAdo.CloseAndFree ();
return 0;
}
int main(int argc, char* argv[])
{
CoInitialize(NULL);
test();
CoUninitialize();
return 0;
}可遗憾的是,引用计数还是错的!
在返回智能指针的时候是自动执行了AddRef,并在调用完毕时候自动进行了Release的,
不是在CoUninitialzie前才释放也就是说,如果我的例子中不是调用QueryInterface,而是如Execute,CommandTimeout之类的普通方法的话,是不会出现这个问题的俺现在还不清楚为什么。也许俺的代码中还有别的错误?
另外,如果把main函数写成多次调用test,
那么最后程序退出的时候,引用计数会更多地上涨!
使用原生指针也需要Release吗?不就是指针吗?原来使用对象指针也没有要求释放啊?