Почему память теста qwebpage все время увеличивается?

Рассматривать:

    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 МБ до 700 МБ. Похоже, утечка памяти существует в моем коде. Но похоже, что все объекты удалены. Почему это?

2

Решение

Это была известная проблема уже в 2009 году. К сожалению, человек, который поднял проблему, не пошел дальше, чтобы фактически подать отчет об ошибке. Вы можете прочитать соответствующую ветку здесь:

http://marc.info/?l=webkit-dev&м = 124888472218111&W = 2

Я бы предложил продолжить и создать отчет об ошибке, если он все еще присутствует в Qt 5.2.

Обратите внимание, что в идеальном мире, как написано, у вас не должно быть кучи объекта для этой операции, хотя это немного не по теме, поскольку это не решит вашу проблему. Тем не менее, лучше иметь в виду, что стековый объект будет выполнять вашу работу без головной боли при удалении вручную.

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

Это намного проще и не требует явного выделения памяти.

0

По вопросам рекламы [email protected]