使用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 = ,
LPCTSTR lpszTargetFrameName = NULL,
LPCTSTR lpszHeaders = NULL, LPVOID lpvPostData = NULL,
DWORD dwPostDataLen = );
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 == )
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, , , );
}
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, , , );
}
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
使用mfc CHtmlView内存泄露解决方法的更多相关文章
- Flex内存泄露解决方法和内存释放优化原则
		
Flex内存泄露解决方法和内存释放优化原则 你对Flex内存泄露的概念是否了解,这里和大家分享一下Flex内存释放优化原则和Flex内存泄露解决方法,希望本文的介绍能让你有所收获. Flex内存释放优 ...
 - android webview内存泄露解决方法
		
完整的activity的onDestroy()方法:@Override protected void onDestroy() { if( mWebView!=null) { // 如果先调用destr ...
 - jmeter 内存溢出解决方法
		
执行“评论新鲜事”200并发就内存溢出 解决方法: [caozijuan@test09 bin]$ vi jmeter JVM_ARGS="-Xms1024m -Xmx4096m" ...
 - XCode编译文件过多导致内存吃紧解决方法
		
XCode编译文件过多导致内存吃紧解决方法 /Users/~~/Library/Developer/Xcode/DerivedData 1) 然后 找到编译文件 删除 就好了哦 快去试试看吧
 - Android使用帧动画内存溢出解决方法
		
Android使用帧动画内存溢出解决方法https://blog.csdn.net/daitu_liang/article/details/52336015https://blog.csdn.net/ ...
 - C#防止内存泄露的方法
		
一般程序员()都会这样认为:用C#这样的语言编程的一个好处就是无需再考虑内存的分配和释放.你只需创建对象,然后通过一种叫做垃圾收集的机制来处理这 些对象,也就是说:当它们不再被应用程序需要的时候来自动 ...
 - JDBC的批量查询报告内存溢出解决方法
		
由于表中的数据过多(我的超过了50W+),查询select * from table ....报告内存溢出 Exception in thread "main" java.lang ...
 - webstorm狂吃内存的解决方法
		
今天使用webstorm,电脑居然卡死了,我的电脑配置: 运行内存16g,1.5T内存的台式, 后来发现,可以通过设置 内存值大小来解决. 具体办法: 找到WebStorm.exe.vmoptions ...
 - Tomcat内存溢出解决方法
		
Java内存溢出详解 一.常见的Java内存溢出有以下三种: 1. java.lang.OutOfMemoryError: Java heap space ----JVM Heap(堆)溢出 JVM在 ...
 
随机推荐
- IT兄弟连 JavaWeb教程 使用AJAX发送GET请求并获取响应
			
GET请求用于获取数据,有时候我们需要获取的数据需要通过"查询参数"进行定位,在这种情况下,我们会将查询参数追加到URL的末尾,令服务器解析. 使用Ajax发送GET请求非常简单, ...
 - argparse 在深度学习中的应用
			
argparse 介绍 argparse模块主要用来为脚本传递命令参数功能,使他们更加灵活. 代码: parser = argparse.ArgumentParser() #建立解析器,必须写 par ...
 - 洛谷P1002  过河卒
			
关于蒟蒻的我,刚刚接触DP.... 那么就来做一道简单DP吧.... 首先先看题: 题目描述 棋盘上AA点有一个过河卒,需要走到目标BB点.卒行走的规则:可以向下.或者向右.同时在棋盘上CC点有一 ...
 - linux 03 命令 续
			
linux 03 命令 续 一.vim 两种操作方式:新文件 pyvip@Vip:~/demo/2_3$ vim demo.txt #操作一个新文件 一开始进入的是命令模式,按i进入插入模式,开始编辑 ...
 - opencv作业
			
作业下载地址: 链接:http://pan.baidu.com/s/1qYQnbkw 密码:v7y9
 - 提升Java代码质量(一)
			
博主双12入手了一本"Effective Java第二版",本系列文章将初步梳理书中内容,我也查了些资料,我会针对知识点做一点展开,方便以后复习回顾; Item1.考虑用静态工厂代 ...
 - linux下指定特定用户执行命令
			
虽然很简单但是百度找的大部分不能用,我是没找到,后来从google找到的 sudo -H -u www bash -c 'nohup /home/web/ke/upfileserver /home/w ...
 - 函数补充:动态参数,函数嵌套,global与nonlocal关键
			
一丶动态参数 1.*args 位置参数,动态传参 def func(*food): print(food) print(func("米饭","馒头"," ...
 - HTML5标签选择指引
 - dedecms会员中心编辑器无法上传图片
			
文件:include\dialog\config.php 找到这行代码: $cuserLogin = new userLogin(); 把上面代码下面的这些注释掉: if($cuserLogin-&g ...