Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 3339|回复: 7
打印 上一主题 下一主题

关于QWebView内存

[复制链接]

437

主题

566

帖子

2381

积分

金牌会员

Rank: 6Rank: 6

积分
2381
跳转到指定楼层
楼主
发表于 2016-11-28 18:31:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 jimu 于 2016-11-28 18:33 编辑

http://bbs.csdn.net/topics/390261419
  1. QWebView* webView=new QWebView(this); //创建QWebView
  2.      webView->page()->setLinkDelegationPolicy(QWebPage::DelegateAllLinks);
  3.     webView->load(QUrl(newsUrl));
复制代码
之后、不管你是delete还是怎么地、指针可以删除、

但是总有那么14M左右的内存怎么都释放不了


求思路 、 求思路 、求思路



stackoverflow 是这样回答的
when you call delete the memory isn't freed in that moment it takes a while and if other objects are not created it might not geed freed until the end of the application. QWebView is a complex class 20 M in 2012 are no longer a concern.The memory will be freed if you do this properly

回复

使用道具 举报

437

主题

566

帖子

2381

积分

金牌会员

Rank: 6Rank: 6

积分
2381
沙发
 楼主| 发表于 2016-11-28 18:33:06 | 只看该作者
  1. #include <QtGui/QApplication>
  2.   #include <QWebView>
  3. int main(int argc, char *argv[])
  4. {
  5.     QApplication a(argc, argv);

  6.     QWebView* w=new QWebView();
  7.     w->settings()->setObjectCacheCapacities(0,0,0);
  8.     w->load(QUrl("http://www.sina.com.cn"));
  9.    w->show();
  10.    delete w;
  11.      return a.exec();
  12. }
复制代码
木有QWebView运行内存是5M、加上QWebView内存是17M


  1. for(int i=0;i<1000;i++){
  2. QWebView* w=new QWebView();
  3.     w->settings()->setObjectCacheCapacities(0,0,0);
  4.     w->load(QUrl("http://www.sina.com.cn"));
  5.    w->show();
  6.    delete w;
  7. }

复制代码
这样运行之后、内存还是一样的!
我个人认为,QWebview加载了内容,就是已经放入内存了。就算你delete了,那部分内存还是被分配给你了。这时只能等系统回收了。而且这种情况,有点类似于以前的非Qt程序也会有这样的情况。你试试最小化后再看看内存占用数?


应该就是只有等自动回收、或者程序退出!


如果我程序一直不退出来,还是不是内存一直会增大?无法释放,到最后是不是系统崩溃???
回复 支持 反对

使用道具 举报

437

主题

566

帖子

2381

积分

金牌会员

Rank: 6Rank: 6

积分
2381
板凳
 楼主| 发表于 2016-11-29 16:46:45 | 只看该作者
本帖最后由 jimu 于 2016-11-29 16:52 编辑

http://www.qtcentre.org/threads/ ... on-QWebView-I-think

You are reusing the webview object but not the webpage object. The page will probably get deleted once you delete the view but as you reuse the view, it's probably not getting deleted waiting until its parent is. You can call QWebView::back() and the previous page will get shown so it's probably not deleted because of that exact behaviour. If you want to get rid of it, then do it manually by calling delete (or deleteLater()) on the webpage object.
And I set no history, then no "back" and "forward" option are available.




It would appear that this is a bug in QWebView:

https://bugs.webkit.org/show_bug.cgi?id=24458
回复 支持 反对

使用道具 举报

437

主题

566

帖子

2381

积分

金牌会员

Rank: 6Rank: 6

积分
2381
地板
 楼主| 发表于 2016-11-29 17:09:05 | 只看该作者
回复 支持 反对

使用道具 举报

437

主题

566

帖子

2381

积分

金牌会员

Rank: 6Rank: 6

积分
2381
5#
 楼主| 发表于 2016-11-29 17:09:29 | 只看该作者
回复 支持 反对

使用道具 举报

437

主题

566

帖子

2381

积分

金牌会员

Rank: 6Rank: 6

积分
2381
6#
 楼主| 发表于 2016-11-29 17:30:50 | 只看该作者
  1. QWebView *web;
  2. web->setUrl(QUrl("http://www.google.com"));


  3. QWebView *web;
  4. web->page()->mainFrame()->setUrl(QUrl("http://www.google.com"));
复制代码
回复 支持 反对

使用道具 举报

437

主题

566

帖子

2381

积分

金牌会员

Rank: 6Rank: 6

积分
2381
7#
 楼主| 发表于 2016-11-29 17:35:18 | 只看该作者
Read This For A "Pseudo-Solution" To The Qt Webkit Memory Leak:

http://qt-project.org/forums/viewthread/11105
回复 支持 反对

使用道具 举报

437

主题

566

帖子

2381

积分

金牌会员

Rank: 6Rank: 6

积分
2381
8#
 楼主| 发表于 2016-11-29 17:52:54 | 只看该作者
QWebElement body=myWebView->page()->mainFrame()->findFirstElement("body");body.setAttribute("onunload","myFunction()");
QWebSettings::clearMemoryCaches();webView->history()->clear();
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|firemail ( 粤ICP备15085507号-1 )

GMT+8, 2024-11-23 08:11 , Processed in 0.063940 second(s), 19 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表