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

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

我正在使用 C++ 上的网络浏览器主机,我设法接收事件,并且我在 DISPID_DOCUMENTCOMPLETE 上运行此无效:

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++,我是通过查看 google 中的其他代码构建这段代码的。现在我知道我必须使用 ->Release,但我必须使用所有这些吗?:

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

因为在我用来构建代码的示例中,它仅将它用于 IHTMLElement(s)。

最佳答案

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

如果为此使用智能指针 - ATL::CComPtr/ATL::CComBSTR_com_ptr_t,你会过得更好/_bstr_t.

关于c++ - 我必须使用 ->Release() 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3856017/

相关文章:

c++ - 类模板中声明的友元函数的模板参数推导

c++ - 将静态库链接到我在 Visual Studio 2010 上的项目

c++:简单的TCP服务器不接受来自客户端的数据

windows - 找不到opencv源

c++ - 调整属性表的错误

c++ - 如何从缩放图像中知道真实图像中的坐标

c++ - 动态创建二维数组

c# - 使用 javascript 禁用 onselect() 事件?

C++ Header #define 编译器错误

c++ - 是否有一个特殊的地方来存储标准 C++ 中的配置