使用mfc CHtmlView内存泄露解决方法

第一步,谷歌有文章说CHtmlView部分api使用BSTR没释放:

解决方法是重写一下接口:

CString GetFullName() const;
CString GetFullName() const;
CString GetType() const;
CString GetLocationName() const;
CString GetLocationURL() const;
void Navigate(LPCTSTR URL, DWORD dwFlags = 0,
LPCTSTR lpszTargetFrameName = NULL,
LPCTSTR lpszHeaders = NULL, LPVOID lpvPostData = NULL,
DWORD dwPostDataLen = 0);
BOOL LoadFromResource(LPCTSTR lpszResource);
BOOL LoadFromResource(UINT nRes);
CString CHtmlViewEx::GetFullName() const
{
    ASSERT(m_pBrowserApp != NULL);

    BSTR bstr;
    m_pBrowserApp->get_FullName(&bstr);
    CString retVal(bstr);

    SysFreeString(bstr); // Added this line to prevent leak.
    return retVal;
}

CString CHtmlViewEx::GetType() const
{
    ASSERT(m_pBrowserApp != NULL);

    BSTR bstr;
    m_pBrowserApp->get_Type(&bstr);

    CString retVal(bstr);

    SysFreeString(bstr); // Added this line to prevent leak.
    return retVal;
}

CString CHtmlViewEx::GetLocationName() const
{
    ASSERT(m_pBrowserApp != NULL);

    BSTR bstr;
    m_pBrowserApp->get_LocationName(&bstr);
    CString retVal(bstr);

    SysFreeString(bstr); // Added this line to prevent leak.
    return retVal;
}

CString CHtmlViewEx::GetLocationURL() const
{
    ASSERT(m_pBrowserApp != NULL);

    BSTR bstr;
    m_pBrowserApp->get_LocationURL(&bstr);
    CString retVal(bstr);

    SysFreeString(bstr); // Added this line to prevent leak.
    return retVal;
}

void CHtmlViewEx::Navigate(LPCTSTR lpszURL, DWORD dwFlags /*= 0*/, LPCTSTR lpszTargetFrameName /*= NULL*/, LPCTSTR lpszHeaders /*= NULL*/, LPVOID lpvPostData /*= NULL*/, DWORD dwPostDataLen /*= 0*/)
{
    CString strURL(lpszURL);
    BSTR bstrURL = strURL.AllocSysString();

    COleSafeArray vPostData;
    if (lpvPostData != NULL)
    {
        if (dwPostDataLen == 0)
            dwPostDataLen = lstrlen((LPCTSTR)lpvPostData);

        vPostData.CreateOneDim(VT_UI1, dwPostDataLen, lpvPostData);
    }

    m_pBrowserApp->Navigate(bstrURL, COleVariant((long)dwFlags, VT_I4), COleVariant(lpszTargetFrameName, VT_BSTR),
        vPostData, COleVariant(lpszHeaders, VT_BSTR));

    SysFreeString(bstrURL); // Added this line to prevent leak.
}

BOOL CHtmlViewEx::LoadFromResource(LPCTSTR lpszResource)
{
    HINSTANCE hInstance = AfxGetResourceHandle();
    ASSERT(hInstance != NULL);

    CString strResourceURL;
    BOOL bRetVal = TRUE;
    LPTSTR lpszModule = new TCHAR[_MAX_PATH];

    if (GetModuleFileName(hInstance, lpszModule, _MAX_PATH))
    {
        strResourceURL.Format(_T("res://%s/%s"), lpszModule, lpszResource);
        Navigate(strResourceURL, 0, 0, 0);
    }
    else
        bRetVal = FALSE;

    delete[] lpszModule;
    return bRetVal;
}

BOOL CHtmlViewEx::LoadFromResource(UINT nRes)
{
    HINSTANCE hInstance = AfxGetResourceHandle();
    ASSERT(hInstance != NULL);

    CString strResourceURL;
    BOOL bRetVal = TRUE;
    LPTSTR lpszModule = new TCHAR[_MAX_PATH];

    if (GetModuleFileName(hInstance, lpszModule, _MAX_PATH))
    {
        strResourceURL.Format(_T("res://%s/%d"), lpszModule, nRes);
        Navigate(strResourceURL, 0, 0, 0);
    }
    else
        bRetVal = FALSE;

    delete[] lpszModule;
    return bRetVal;
}

第二步,由于加载页面js脚本并没有释放js变量所分配的内存,有两种解决方法:第一种,调用本地html文件,调用CollectGarbage()接口回收变量的内存,html文件代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head> 

<body>
    <script type="text/javascript">
        if (typeof window.CollectGarbage === ‘function‘) {
            CollectGarbage()
        }
    </script>

</body>
</html> 

第二种:如果不需要调用html页面的js代码,可以直接关闭IE浏览器的js脚本功能:https://jingyan.baidu.com/article/48206aead44e53216ad6b397.html

转载请注明出处,from博客园hemjohn

原文地址:https://www.cnblogs.com/HemJohn/p/10901681.html

时间: 2024-07-30 20:51:29

使用mfc CHtmlView内存泄露解决方法的相关文章

Flex内存泄露解决方法和内存释放优化原则

本文向大家简单介绍一下Flex内存泄露问题,主要包括Flex内存释放优化原则和Flex内存泄露解决方法两大部分内容,希望你会感兴趣. 作者:vipoyb来源:csdn.net|2010-07-29 14:08   你对Flex内存泄露的概念是否了解,这里和大家分享一下Flex内存释放优化原则和Flex内存泄露解决方法,希望本文的介绍能让你有所收获. Flex内存释放优化原则 1.被删除对象在外部的所有引用一定要被删除干净才能被系统当成垃圾回收处理掉: 2.父对象内部的子对象被外部其他对象引用了,

Tomcat内存泄露解决方法

环境: 今天早上,实施人员找我说,部署在tomcat上的一个项目总是间隔一段时间就自动关闭了,我询问一些可能发生的情况后,我就找了tomcat下的日志文件catalina.2015-04-13.log,localhost.2015-04-13.log这两文件,经过一番查找后,看到了下面一段 异常详细信息介绍: http://confluence.atlassian.com/pages/viewpage.action?pageId=218275753 原因大概是说tomcat 6.025之后引入了

C#防止内存泄露的方法

一般程序员()都会这样认为:用C#这样的语言编程的一个好处就是无需再考虑内存的分配和释放.你只需创建对象,然后通过一种叫做垃圾收集的机制来处理这 些对象,也就是说:当它们不再被应用程序需要的时候来自动的清除这些对象.这个过程意味着C#解决了其它语言中极难处理的问题──可怕的内存泄露.真的是 这样吗?      其实不然,让我们先了解一下垃圾收集的工作原理.垃圾收集器的工作就是寻找那些不再被应用程序需要的对象,当它们不会再被访问或引用的时候清除它们.(一定要注意是在不会再被访问或引用的时候才清除它

C++内存泄露检查方法

重载全局new 可以写多个版本的new,却只有一个delete: 重载全局new会发生一些不匹配的串扰,尤其是有第三方库的情况下: 我的解决办法 重载单个class的new: 原始类型不能重载,那就使用类似于malloc的办法分配: 我的cfan开源库实现了这个方法 操作系统hook机制 http://my.oschina.net/chunquedong/blog/271248 这些都不跨平台,使用也不方便: valgrind等工具 不跨平台: 除非能实现持续集成,否则很难及时反馈: 有时候引起

Webloginc 内存溢出解决方法

  Webloginc 内存溢出解决方法  : javax.servlet.ServletException: java.lang.OutOfMemoryError: PermGen space 解决方法: 1.在base_domain 域下找到startWebLogic.bat 文件,然后打开编辑, 2.然后加入以下的代码 JAVA_OPTS='-Xms512m -Xmx2048m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=25

MyEclipse内存溢出解决方法

MyEclipse内存溢出解决方法 1.修改eclipse.ini 在Myeclipse安装目录下G:\MyEclipse8.5\Genuitec\MyEclipse 8.5有一个myeclipse.ini配置文件,设置如下: -vmargs-Xmx512m-XX:MaxPermSize=256m-XX:ReservedCodeCacheSize=64m 2.设置Default VM Arguments 在myEclipse中,打开Windows-> Preferences->Java->

XCode编译文件过多导致内存吃紧解决方法

XCode编译文件过多导致内存吃紧解决方法 /Users/~~/Library/Developer/Xcode/DerivedData 1) 然后 找到编译文件 删除 就好了哦 快去试试看吧

WebView 避免内存泄露的方法

最近遇到一个Webview内存泄露的问题,上网查了一些结果,在此记录一下: webview在android系统中属于一个比较特殊的view,在调用 webview.destroy()的时候,必须确保webview已经从view tree中被删除,否则这个函数不会执行的.如本app中的用法,在xml中静态定义的webview,只有在整个view退出后调用 webview.destroy()才会被正确执行,但整个view退出后又找不到webview了,这个是很矛盾的. 所以android给出的解决方

Android 导航(介绍)页面ViewPager内存溢出解决方法

现在基本每个Android App都会标配一个启动介绍的页面,或做产品介绍,或做app功能展示,既然起导航界面,基本思路就是用ViewPager实现.(图片引自UI中国一设计师的设计图片) 正好这几天在做这个导航界面,我的测试手机是魅族MX3,做完之后测试还行,没有明显卡顿的现象,但是当我把debug的apk装到米3和魅蓝上时,程序运行到这个导航界面会马上crash掉,偶尔没有crash也会出现明显的卡顿现象,体验效果非常差. 打开Android Studio的内存管理器查看运行时分配内存,当时