mickyo 2023-10-14 17:05 采纳率: 77.8%
浏览 4
已结题

CHtmlView 求解内存只吃不吐

我在一个MFC应用里使用 CHtmlView 作为视图,按计划任务浏览指定网站,抓取信息,结果发现内存只吃不吐,关闭程序才吐出来,晕死,请教解决办法。我在线程里传入视图指针,执行浏览网站动作 pView->Navigate2(_T(row[2]),NULL,NULL);

每访问一个网页,执行如下代码:

bool CZBReportView::GXYYQYGetUrl(BSTR tagName,BSTR attrValue,CStringList& list,CStringList& list2,int type)
{    // 按照指定元素,所有内容
    g_pDispatch=GetHtmlDocument();
    if (SUCCEEDED(g_pDispatch->QueryInterface(IID_IHTMLDocument3, (void **)&g_pHtmlDoc3)))    //  获取 IHTMLDocument3
    {
        if (SUCCEEDED(g_pHtmlDoc3->getElementsByTagName(tagName, &g_pElementCollection)))   //  获取  IHTMLElementCollection   指定的  元素集合
        {
            long lCount = 0;
            g_pElementCollection->get_length(&lCount);   //  获取  指定的 元素集合数量
            for(long i = 0; i < lCount; i++)
            {
                CComVariant varName(i);varName.ChangeType(VT_UINT);                
                CComVariant varIndex;
                if (SUCCEEDED(g_pElementCollection->item(varName, varIndex, &g_pDispatch2)))  // 循环获取每个 指定的 元素    
                {
                    if (SUCCEEDED(g_pDispatch2->QueryInterface(IID_IHTMLElement, (void**)&g_pElemment)))  // 获取每个 指定的 元素的 IHTMLElement 接口
                    {
                        if(type==1)
                        {   // 搜索classname
                            GetFromClassName2(attrValue,list,list2);
                        }
                        else
                        {   // 搜索attributevalue
                            GetFromAttributeName2(attrValue,list,list2);
                        }
                        if(g_pElemment!=NULL){g_pElemment->Release();g_pElemment=NULL;}
                    }    
                    if(g_pDispatch2!=NULL){g_pDispatch2->Release();g_pDispatch2=NULL;}        
                }                                
            }    
            if(g_pElementCollection!=NULL){g_pElementCollection->Release();g_pElementCollection=NULL;}            
        }
        if(g_pHtmlDoc3!=NULL){g_pHtmlDoc3->Release();g_pHtmlDoc3=NULL;}
    }
    if(g_pDispatch!=NULL){g_pDispatch->Release();g_pDispatch=NULL;}    
    return g_bGetURL;
}

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-10-14 20:17
    关注

    【以下回答由 GPT 生成】

    对于CHtmlView内存泄漏问题,一种可能的解决方案是手动释放相关资源。根据提供的代码,以下是可能导致内存泄漏的地方和相应的解决方案:

    1. 在每次访问网页后释放相关资源,包括g_pDispatchg_pHtmlDoc3g_pElementCollectiong_pDispatch2g_pElemment
    // 在GXYYQYGetUrl函数的最后添加释放资源的代码
    if (g_pElemment)
    {
        g_pElemment->Release();
        g_pElemment = nullptr;
    }
    
    if (g_pDispatch2)
    {
        g_pDispatch2->Release();
        g_pDispatch2 = nullptr;
    }
    
    if (g_pElementCollection)
    {
        g_pElementCollection->Release();
        g_pElementCollection = nullptr;
    }
    
    if (g_pHtmlDoc3)
    {
        g_pHtmlDoc3->Release();
        g_pHtmlDoc3 = nullptr;
    }
    
    if (g_pDispatch)
    {
        g_pDispatch->Release();
        g_pDispatch = nullptr;
    }
    
    1. 确保只在需要时进行接口查询,并在使用后释放资源。
    // 这里假设GetFromClassName2和GetFromAttributeName2函数中没有涉及到接口查询,不需要释放资源
    
    // 在GXYYQYGetUrl函数的最后添加释放资源的代码
    if (g_pElemment)
    {
        g_pElemment->Release();
        g_pElemment = nullptr;
    }
    
    if (g_pDispatch2)
    {
        g_pDispatch2->Release();
        g_pDispatch2 = nullptr;
    }
    
    if (g_pElementCollection)
    {
        g_pElementCollection->Release();
        g_pElementCollection = nullptr;
    }
    
    if (g_pHtmlDoc3)
    {
        g_pHtmlDoc3->Release();
        g_pHtmlDoc3 = nullptr;
    }
    
    if (g_pDispatch)
    {
        g_pDispatch->Release();
        g_pDispatch = nullptr;
    }
    

    请注意,在以上的代码修改中,我假设GetFromClassName2GetFromAttributeName2函数中没有涉及到接口查询且不需要释放相关资源。如果这两个函数中涉及到了接口查询和资源分配,请根据具体情况进行释放操作。

    以上是修复内存泄漏的两个关键点,通过释放相关资源可以减少内存消耗并解决内存泄漏问题。根据您提供的信息,以上修改应该可以解决您的问题。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 10月26日
  • 已采纳回答 10月18日
  • 创建了问题 10月14日