现在我在解析XML文件的时候,对于重复的一些部分写成了函数进行处理。函数的基本定义如下:
void MyXMLParser::Initialize(IXMLDOMElementPtr& pDOMElement) 
其中参数pDOMElement我传递的是一个XML节点的信息,不知这样的传递方式是否正确?智能指针是否需要释放?

解决方案 »

  1.   

    You are right.No need to release smart pointer.
      

  2.   

    用IXMLDOMElementPtr&,IXMLDOMElementPtr,IXMLDOMElement*传都可以,都不需要释放指针。IXMLDOMElement*效率高一些。
      

  3.   

    呵呵,俺以为没有什么东西是大错特错,或者大对特对的!看下边的代码……不包括错误和异常处理
    按你所说,返回的智能指针。
    执行看起来一切正常,可如果你查看一下引用计数,就知道
    _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;
    }
      

  4.   

    myAdo.GetConn()返回的ConnectionPtr 当然会被释放,只不过是在CoUninitialize();之后释放,所以不对。这样写就对了:
    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;
    }如果你返回的是原生指针,那才是真的没有机会去释放了。
      

  5.   

    呵呵,按楼上的说法,那么写成这样更容易理解一些:int test()
    { 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;
    }可遗憾的是,引用计数还是错的!
      

  6.   

    其实,跟踪代码就发现,myAdo.GetConn()->DoSomething
    在返回智能指针的时候是自动执行了AddRef,并在调用完毕时候自动进行了Release的,
    不是在CoUninitialzie前才释放也就是说,如果我的例子中不是调用QueryInterface,而是如Execute,CommandTimeout之类的普通方法的话,是不会出现这个问题的俺现在还不清楚为什么。也许俺的代码中还有别的错误?
    另外,如果把main函数写成多次调用test,
    那么最后程序退出的时候,引用计数会更多地上涨!
      

  7.   

    各位这智能指针,我怎么觉得一点都不智能呢?
    使用原生指针也需要Release吗?不就是指针吗?原来使用对象指针也没有要求释放啊?
      

  8.   

    各位我还有一个问题。我在我的类中定义了一个静态变量IXMLDocumentPtr用来装载我的XML配置文件,我的多线程处理程序会读取XML配置文件进行处理工作,请问在这样的情况下,多线程访问IXMLDocumentPtr时是否需要同步控制,我只做一些读操作不会对XML文档进行修改。
      

  9.   

    跨线程的接口传递必须使用MARSHAL/UNMARSHAL,否则是不安全的。