我必须使用 - > Release()吗?

时间:2010-10-04 14:07:59

标签: c++ visual-studio-2010 visual-c++ memory-management

我正在使用c ++上的webbrowser主机,我设法接收事件,我在DISPID_DOCUMENTCOMPLETE上运行此void:

void DocumentComplete(LPDISPATCH pDisp, VARIANT *url)
{
    READYSTATE rState;

    iBrowser->get_ReadyState(&rState);

    if(rState == READYSTATE_COMPLETE)
    {
        HRESULT hr;
        IDispatch *pHtmlDoc = NULL;
        IHTMLDocument2 *pDocument = NULL;
        IHTMLElement *pBody = NULL;
        IHTMLElement *lpParentElm = NULL;
        BSTR bstrHTMLText;

        hr = iBrowser->get_Document(&pHtmlDoc);

        hr = pHtmlDoc->QueryInterface(IID_IHTMLDocument2, (void**)&pDocument);

        if( (FAILED(hr)) || !pDocument)
        {
            MessageBox(NULL, "QueryInterface failed", "WebBrowser", MB_OK);
        }

        hr = pDocument->get_body( &pBody );

        if( (!SUCCEEDED(hr)) || !pBody)
        {
            MessageBox(NULL, "get_body failed", "WebBrowser", MB_OK);
        }

        pBody->get_parentElement(&lpParentElm);

        lpParentElm->get_outerHTML(&bstrHTMLText);

        _bstr_t bstr_t(bstrHTMLText);

        std::string sTemp(bstr_t);

        MessageBox(NULL, sTemp.c_str(), "WebBrowser", MB_OK);
    }
}

我对c ++并不多,我通过观看谷歌中的其他代码来构建此代码。现在我知道我必须使用 - >发布,但是我必须使用所有这些吗?:

    pHtmlDoc->Release();
    pDocument->Release();
    pBody->Release();
    lpParentElm->Release();
    iBrowser->Release();

因为在我用来构建代码的例子中,它只用于IHTMLElement。

3 个答案:

答案 0 :(得分:4)

是的,您必须在这些指针上调用Release(),否则对象将泄漏。 BSTR s也是如此。

如果您使用智能指针,那将会好得多 - ATL::CComPtr / ATL::CComBSTR_com_ptr_t / _bstr_t

答案 1 :(得分:3)

您应该将这些对象包装到CComPtr或其中一个变体中。这将为您处理发布。它符合RAII的概念。

答案 2 :(得分:1)

是的,你这样做。但不是在iBrowser上,你没有在这段代码中获得那个指针。

请注意,您的错误检查不充分,当get_Document()失败时,您的代码将会爆炸。 get_parentElement()也是如此。消息框被解除后。