Russian Qt Forum

Qt => Установка, сборка, отладка, тестирование => Тема начата: n4ela от Январь 11, 2010, 22:51



Название: Течет QWebView
Отправлено: n4ela от Январь 11, 2010, 22:51
Столкнулся с тем что память при удалении QWebView очищается не полностью.
Привожу пример:
Есть class Tabbing наследуемый от QTabWidget
В этом классе есть вектор QVector< WebBrowser* > webBrowser;
WebBrowser наследуется от QWebView
Новая вкладка создается так.
Коментария на русском не отображаются, напишу транслитом.
Код
C++ (Qt)
void Tabbing::createTab( QString url )
{
   webBrowser.append( new WebBrowser( this, guessUrlFromString( url ), webBrowser.size() ) ); /*Sozdaem novii webview*/
   this->addTab( webBrowser.last(), QString( tr( "Loading..." ) ) ); /*Dobavlaem ego v tabbar*/
 
   connect( webBrowser.last(), SIGNAL( titleChanged( QString ) ),
            webBrowser.last(), SLOT( getIndex( QString ) ) );
 
   connect( webBrowser.last(), SIGNAL( changeTitle( QString, int ) ),
            this, SLOT( changeTitle( QString, int ) ) );
 
   connect( webBrowser.last(), SIGNAL( loadStarted() ),
            webBrowser.last(), SLOT( getIndex() ) );
 
}
 
Удаляю вкладку так:
Код
C++ (Qt)
void Tabbing::removeDTab()
{
   int currentIndex = this->currentIndex(); /*Zapominaem index tekusei vkladki*/
   delete webBrowser.at( currentIndex ); /*Ochisaem pamat iz pod obekta vektora*/
   webBrowser.remove( currentIndex ); /*Ydalaem obekt v vektore*/
   removeTab( currentIndex ); /*Ydalaem tab*/
   for ( int i = currentIndex + 1; i < webBrowser.size(); i++ )
           webBrowser.at(i)->counterMinus(); /*Smeshaem kazdii sledyesii element*/
}
 
Вроде бы все правильно, удалил и очистил все что надо. Но на практике это не так.
Сужу по htop'y при запуске программы с одной вкладкой rambler.ru занимаемая память 0.8%, открываю еще 49-т вкладок с рамблером занимаемой оперативки становится 4.6%, удаляю 49 вкладок, память 3.8%.
Вот с чем связано такая утечка памяти, я что то не так удаляю? Может надо вызвать какой нибудь метод для очистки кеша или еще что? В гугли нашел несколько человек с такими же вопросами, но внятного ответа так и нет, единственное что вычитал что это проблема самого WebKita в Qt. Так ли это?
Пока писал этот пост заметил что пока я не трогал свою программу занимаемая память уменьшалась с 3.8% до 2.5%


Название: Re: Течет QWebView
Отправлено: Dendy от Январь 12, 2010, 00:21
Пользуйтесь Valgrind'ом.


Название: Re: Течет QWebView
Отправлено: n4ela от Январь 12, 2010, 01:08
Пробовал прогонять в нем, не уверен что правильно в нем все понимаю.
Вот последнии строчки лога
Код
C++ (Qt)
==15621== LEAK SUMMARY:
==15621==    definitely lost: 16,328 bytes in 203 blocks
==15621==    indirectly lost: 2,350,758 bytes in 4,175 blocks
==15621==      possibly lost: 2,491,408 bytes in 4,033 blocks
==15621==    still reachable: 2,978,313 bytes in 12,625 blocks
==15621==         suppressed: 0 bytes in 0 blocks
==15621== Reachable blocks (those to which a pointer was found) are not shown.
==15621== To see them, rerun with: --leak-check=full --show-reachable=yes
==15621==
==15621== For counts of detected and suppressed errors, rerun with: -v
==15621== Use --track-origins=yes to see where uninitialised values come from
==15621== ERROR SUMMARY: 117690 errors from 323 contexts (suppressed: 131 from 12)
 
т.е. получается что утекло всего порядка 15кб.
почему же тогда в htop'e такое большое различие между только что запущенной программой и программой после некоторого времени работы в ней.


Название: Re: Течет QWebView
Отправлено: BRE от Январь 12, 2010, 01:09
почему же тогда в htop'e такое большое различие между только что запущенной программой и программой после некоторого времени работы в ней.
Потому что он показывает не совсем ту "память", которую ты от него ожидаешь.