为什么 q网页测试的内存一直在增加?
Why is the memory of a qwebpage's test increasing all the time?
考虑:
QString urls[] = {
QString("http://www.sina.com")
};
int len = 1;
QWebSettings::setMaximumPagesInCache(0);
QEventLoop loop;
for (int i = 0; i < 200000; i++) {
QWebPage *page = new QWebPage;
page->settings()->setAttribute(
QWebSettings::AutoLoadImages,
false);
page->settings()->setAttribute(
QWebSettings::PrintElementBackgrounds,
false);
page->settings()->setAttribute(
QWebSettings::JavascriptEnabled,
false);
QString url = urls[i % len];
cout << "requesting " << url.toStdString() << endl;
connect(page, SIGNAL(loadFinished(bool)),
&loop, SLOT(quit()));
page->mainFrame()->load(url);
loop.exec();
disconnect(page, 0, 0, 0);
QWebSettings::clearMemoryCaches();
page->settings()->clearMemoryCaches();
connect(page, SIGNAL(destroyed()),
&loop, SLOT(quit()));
printLog(page->mainFrame()->toHtml());
page->deleteLater();
loop.exec();
}
执行此测试时,内存从大约 40 MB 增加到大约 700 MB。看起来我的代码中存在内存泄漏。但似乎所有对象都被删除了。这是为什么呢?
这在 2009 年就已经是一个已知问题。不幸的是,提出这个问题的人并没有进一步实际提交错误报告。您可以在此处阅读相应的线程:
http://marc.info/?l=webkit-dev&m=124888472218111&w=2
如果Qt 5.2仍然存在,我建议继续创建一个错误报告。
请注意,在理想情况下,正如所写的那样,您不应该为此操作使用堆对象,尽管它有点偏离主题,因为它不会解决您的问题。然而,最好注意的是,这里的堆栈对象可以完成您的工作,而不会手动删除头痛。
我会尝试通过以下方式重写您的代码:
QString urls[] = {
QString("http://www.sina.com");
};
int len = 1;
QWebSettings::setMaximumPagesInCache(0);
QEventLoop loop;
QWebPage page;
for (int i = 0; i < 200000; i++) {
page.settings()->setAttribute(QWebSettings::AutoLoadImages, false);
page.settings()->setAttribute(QWebSettings::PrintElementBackgrounds, false);
page.settings()->setAttribute(QWebSettings::JavascriptEnabled, false);
QString url = urls[i % len];
cout << "requesting " << url.toStdString() << endl;
connect(page, SIGNAL(loadFinished(bool)), &loop, SLOT(quit()));
page.mainFrame()->load(url);
loop.exec();
QWebSettings::clearMemoryCaches();
page.settings()->clearMemoryCaches();
printLog(page.mainFrame()->toHtml());
}
它要简单得多,不需要显式内存分配。
相关文章:
- 数组索引的值没有增加
- 为什么我的代码在输出中增加了93天
- 有效地使用std::unordered_map来插入或增加键的值
- 即使我读取了所有内容,在FIFO上打开的QSocketNotifier也会一直启动
- C++ 动态数组每次添加时将大小增加 1 - 错误
- 为什么要增加导致崩溃的指针
- Switch 语句(字符串)一直选择默认值,除非其为零
- 增加传递地址的值
- 如何增加以前由新运算符分配的 C++ std::list 数组的大小?
- 链接 c++ 动态库一直失败
- 我试图用这段代码找到二叉树的高度,但它一直返回 0,有人可以告诉我为什么吗?
- 我正在尝试创建一个菜单,但我的代码一直在循环
- 为什么"i"在循环的每次迭代中都没有增加?(C++)
- std::thread 增加 DLL 引用计数,从而防止卸载 DLL
- 我想在 c++ 中对单向链表进行冒泡排序,但我一直面临左值错误,无法解决它
- 如何在C++中为增加但记住删除先前对象的对象分配唯一标识符
- 将一对插入地图并增加计数?
- 整数类型应该显式转换(例如"int"到"无符号")还是只会增加混乱?
- 我的 c++ 应用程序中的运行时间从 0 增加到 60 太快了(例如一毫秒或一微秒)
- 为什么 q网页测试的内存一直在增加?