写了这个测试,为什么app内存泄露测试很严重,好像IWebBrowser2没有释放

如何检查内存泄露问题_百度知道
如何检查内存泄露问题
我有更好的答案
com/tools/visualleakdetector.asp 下载到。相比较其它的内存泄露检测工具,稍有不慎就会出现内存问题。内存泄漏是最常见的内存问题之一。内存泄漏如果不是很严 重。对于想深入了解堆内存管理的读者,可以学习到堆内存分配与释放的原理、内存泄漏检测的原理及内存操作的常用技巧等。&lt,使用时无须编译它的源代码。而对于使用者自己的代码,也只需要做很小的改动;src&#47,则将包含vld.. .。可以在http
采纳率:95%
来自团队:
为您推荐:
其他类似问题
订婚的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。当前位置:
写了这个测试,为什么内存泄露很严重,好像IWebBrowser2没有释放
写了这个测试,为什么内存泄露很严重,好像IWebBrowser2没有释放
来源:网络整理&&&&&时间: 15:21:56&&&&&关键词:
关于网友提出的“ 写了这个测试,为什么内存泄露很严重,好像IWebBrowser2没有释放”问题疑问,本网通过在网上对“ 写了这个测试,为什么内存泄露很严重,好像IWebBrowser2没有释放”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题: 写了这个测试,为什么内存泄露很严重,好像IWebBrowser2没有释放
/////////////////////////////////////////////////////////////////////////////
//&CAtlCon&-&Example&of&generic&ActiveX&Hosting&window
class&CAtlCon&:&public&CWindowImpl&CAtlCon,&CWindow,&CWinTraits&WS_OVERLAPPEDWINDOW&|&WS_VISIBLE&|&WS_CLIPCHILDREN&|&WS_CLIPSIBLINGS,&WS_EX_APPWINDOW&|&WS_EX_WINDOWEDGE&&&
,public&IDispEventImpl&1,CAtlCon,&__uuidof(DWebBrowserEvents2),&LIBID_SHDocVw,1,&0&
#define&WM_MYTEST&WM_USER+1
DECLARE_WND_CLASS_EX(NULL,&0,&0)
BEGIN_MSG_MAP(CAtlCon)
MESSAGE_HANDLER(WM_CREATE,&OnCreate)
MESSAGE_HANDLER(WM_DESTROY,&OnDestroy)
COMMAND_ID_HANDLER(ID_FILE_OPEN,&OnFileOpen)
COMMAND_ID_HANDLER(ID_APP_EXIT,&OnFileExit)
MESSAGE_HANDLER(WM_SIZE,&OnSize)
MESSAGE_HANDLER(WM_ERASEBKGND,&OnErase)
MESSAGE_HANDLER(WM_MYTEST,&OnTest)
END_MSG_MAP()
BEGIN_SINK_MAP(CAtlCon)
//Make&sure&the&Event&Handlers&have&__stdcall&calling&convention
SINK_ENTRY_EX(1,__uuidof(DWebBrowserEvents2),DISPID_DOCUMENTCOMPLETE,OnDocumentComplete)
END_SINK_MAP()
HRESULT&__stdcall&OnDocumentComplete(IDispatch*&pDisp,&VARIANT*&url)
CComPtr&IWebBrowser2&&
pDisp-&QueryInterface(IID_IWebBrowser2,&(void**)&pwb);
if&(pwb&&&&pwb&==&m_pBrowser2)
DispEventUnadvise(m_pBrowser2);
m_pBrowser2-&Quit();
m_pBrowser2-&Release();
m_pBrowser2&=&NULL;
ATLTRACE("OnDocumentComplete\r\n");
PostMessage(WM_MYTEST);
return&S_OK;
void&OnFinalMessage(HWND&/*hWnd*/)
::PostQuitMessage(0);
LRESULT&OnDestroy(UINT&,&WPARAM&,&LPARAM&,&BOOL&&bHandled)
OleUninitialize();
bHandled&=&FALSE;
LRESULT&OnCreate(UINT&,&WPARAM&,&LPARAM&,&BOOL&&)
AtlAxWinInit();
OleInitialize(NULL);
m_pBrowser2&=&NULL;
GetClientRect(&rcClient);
m_wndView.Create(m_hWnd,&rcClient,&_T(""),&WS_CHILD&|&WS_VISIBLE&|&WS_CLIPCHILDREN,&WS_EX_CLIENTEDGE);
LRESULT&OnErase(UINT&,&WPARAM&,&LPARAM&,&BOOL&&)
LRESULT&OnSize(UINT&,&WPARAM&,&LPARAM&,&BOOL&&)
LRESULT&OnTest(UINT&,&WPARAM&,&LPARAM&,&BOOL&&)
TestWeb();
int&TestWeb()
CComPtr&IOleObject&&browserO
CComPtr&IUnknown&&pUnk&=&NULL;&
CoCreateInstance(CLSID_WebBrowser,&NULL,&CLSCTX_INPROC,&
IID_IWebBrowser2,&(void**)&m_pBrowser2);
if&(m_pBrowser2)
m_wndView.AttachControl(m_pBrowser2,&&pUnk);
m_pBrowser2-&QueryInterface(IID_IOleObject,&(void&**)&browserObject);
DispEventAdvise(m_pBrowser2);
VARIANT&vE
VariantInit(&vEmpty);
BSTR&bstrURL&=&SysAllocString(L"D:\\test.htm");
HRESULT&hr&=&m_pBrowser2-&Navigate(bstrURL,&&vEmpty,&&vEmpty,&&vEmpty,&&vEmpty);
if&(SUCCEEDED(hr))
m_pBrowser2-&put_Visible(VARIANT_TRUE);
m_pBrowser2-&Quit();
ATLTRACE("Navigated\r\n");
SysFreeString(bstrURL);
LRESULT&OnFileOpen(WORD&,&WORD&,&HWND&,&BOOL&&)
PostMessage(WM_MYTEST);
LRESULT&OnFileExit(WORD&,&WORD&,&HWND&,&BOOL&&)
DestroyWindow();
CAxWindow&m_wndV
IWebBrowser2*&&&&m_pBrowser2;
我的目的是需要创建一个客户端,连接后就可以关闭的了;
这个代码演示了
触发OnFileOpen后,程序就进入循环
创建IWebBrowser,Navigate,&OnDocumentComplete里释放
为什么这个流程内存泄露很严重呢,哪里的问题,怎么解决?谢谢解决方案1:
好长,帮顶
解决方案2:
IWebBrowser2*&&&&m_pBrowser2;&
为什么要经常创建IWebBrowser?
解决方案3:
你不觉得死循环了吗?
在HRESULT&__stdcall&OnDocumentComplete(IDispatch*&pDisp,&VARIANT*&url)里又进行一次
PostMessage(WM_MYTEST);&
解决方案4:引用&3&楼&prodiving&的回复:实际应用中当然不是这样的代码,&
但是我实际应用中要经常创建IWebBrowser,Navigate,&OnDocumentComplete里释放&
这个流程任务管理器里面很明显,&内存不断上升…………&
刚才看到一个连接http://support.microsoft.com/kb/229904/en-us/,&
说CAxWndow这样用会内存泄露,意思应该是创建或附加对象应该用QueryHost&查询IAxWinHostWindow,通过IAxWinHostWindow创建或附加对象,&
但是我刚刚改完后发现还是内存泄露……
既然这样,把CWebBrowser*&作为成员变量,创建一个,然后公用这个...防止反复申请,释放..
以上介绍了“ 写了这个测试,为什么内存泄露很严重,好像IWebBrowser2没有释放”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/3566832.html
上一篇: 下一篇:内存泄漏的检测、定位和解决经验总结_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
内存泄漏的检测、定位和解决经验总结
&&结合局端MCU项目中CSS、NMS模块内存泄漏检测、修正的过程,简要介绍了内存泄漏检测的工具,提出了内存泄漏检测的一些方法(怎样对程序结构进行改造,怎样对程序进行隔离以易于进行内存泄漏检测)。总结了内存泄漏检测过程中成功和失败的体会,希望能对后来者有所启发。
阅读已结束,下载本文需要
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩4页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢& & & 作为一名iOS开发攻城狮,在苹果没有出ARC(自动内存管理机制)时,我们几乎有一半的开发时间都耗费在这么管理内存上.后来苹果很人性的出了ARC,虽然在很大程度上,帮助我们开发者节省了精力和时间.但是我们在开发过程中,由于种种原因,还是会出现内存泄露的问题.内存泄露是一个很严重的问题.下面就简单介绍下怎么使用Xcode7自带的Instruments中的Leaks检测我们的程序有没有内存泄露和定位内存泄露的代码.(分析内存泄露不能把所有的内存泄露查出来,有的内存泄露是在运行时,用户操作时才产生的)
第一步:打开Xcode7自带的Instruments
按上面操作,build成功后跳出Instruments工具,选择Leaks选项
选择之后界面如下图:
到这里之后,我们前期的准备工作做完啦,下面开始正式的测试!
1.选中Xcode先把程序(command + R)运行起来
2.再选中Xcode,按快捷键(command + control + i)运行起来,此时Leaks已经跑起来了
3.由于Leaks是动态监测,所以我们需要手动操作APP,一边操作,一边观察Leaks的变化,当出现红色叉时,就监测到了内存泄露,点击右上角的第二个,进行暂停检测(也可继续检测,当多个时暂停,一次处理了多个).如图所示:
4.下面就是定位修改了,此时选中有红色柱子的Leaks,下面有个"田"字方格,点开,选中Call Tree
显示如下图界面
5.下面就是最关键的一步,在这个界面的右下角有若干选框,选中Invert Call Tree 和Hide System Libraries,(红圈范围内)显示如下:
到这里就算基本完成啦,这里显示的就是内存泄露代码部分,那么现在还差一步:定位!
6.选中显示的若干条中的一条,双击,会自动跳到内存泄露代码处,如图所示
7.找到了内存泄露的地方,那么我们就可以修改即可
阅读(...) 评论()2009年7月 总版技术专家分月排行榜第二2009年3月 总版技术专家分月排行榜第二2009年1月 总版技术专家分月排行榜第二2005年7月 总版技术专家分月排行榜第二2005年5月 总版技术专家分月排行榜第二2005年3月 总版技术专家分月排行榜第二
优秀小版主2015年8月优秀小版主2015年9月优秀小版主2015年5月优秀小版主2015年2月论坛优秀版主
2009年7月 总版技术专家分月排行榜第二2009年3月 总版技术专家分月排行榜第二2009年1月 总版技术专家分月排行榜第二2005年7月 总版技术专家分月排行榜第二2005年5月 总版技术专家分月排行榜第二2005年3月 总版技术专家分月排行榜第二
优秀小版主2015年8月优秀小版主2015年9月优秀小版主2015年5月优秀小版主2015年2月论坛优秀版主
匿名用户不能发表回复!|}

我要回帖

更多关于 内存泄露测试工具 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信