为什么 q网页测试的内存一直在增加?

Why is the memory of a qwebpage's test increasing all the time?

本文关键字:一直 增加 内存 网页 测试 为什么      更新时间:2023-10-16

考虑:

    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());
}

它要简单得多,不需要显式内存分配。