![]() |
|
|
![]()
|
|
| brag |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 16.5.2009 Репутация: нет Всего: нет |
добрый день!
я в C++ не силен,тем более в QT. моя стихия - низкоуровневое програмирование подскажите,плиз такую вещь: если есть QTableWidget, в него надо напихать, скажем 1000записей. как я понял,создается новый экземпляр обьекта QTableWidgetItem item=new QTableWidgetItem(tr("aaa")); и затем пихается в этот QTableWidget ui.tableWidget->setItem(row,col,item); а как быть с освобождением памяти? если,мне, скажем, нужно записать новые данные в таблицу? я делал tableWidget->clearContents(); tableWidget->setRowCount(0); но по стату видно,что память, выделенная приложению растет. те, получается,нужно так же в цикле доставать адреса всех итемов и освобождать? или есть какие-то более красивые решения? даже в winapi простой listview можно освободить одним сообщением за ренее,спасибо! |
|||
|
||||
| Remiznik |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 379 Регистрация: 30.4.2005 Репутация: нет Всего: 1 |
а попробовать использовать
void QTableWidget::removeCellWidget ( int row, int column ) Removes the widget set on the cell indicated by row and column. |
|||
|
||||
| brag |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 16.5.2009 Репутация: нет Всего: нет |
всеравно память растет :(
причем именно растет, а не выделяются ранее неиспользованные, но выделенные стртаницы. я думал, тут все намного проще, а получается сложнее..мне на своем низком уровне нужно следить за выделением/освобождением, а тут надо ещ больше следить Добавлено через 7 минут и 39 секунд парится с очисткой не надо, достаточно tableWidget->setRowCount(0); и оно прочистит. только сами обьекты остануться выделенными и будут накоплять память. провервл. с таблицей с данными делал tableWidget->setRowCount(0); tableWidget->setRowCount(2); 2 строки появились, но пустые. прийдется писать метод для бегания по таблице и освобождения памяти |
|||
|
||||
| brag |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 16.5.2009 Репутация: нет Всего: нет |
сварганил что-то подобное
но память всеравно растет |
|||
|
||||
| Remiznik |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 379 Регистрация: 30.4.2005 Репутация: нет Всего: 1 |
я не уверен а попробуй создавать QTableWidgetItem не динамически , а передовать через ссылку !
незнаю что получиться и реаьно ли вобше это ! Добавлено через 4 минуты
для удаления нужно брать итем ! QTableWidgetItem * QTableWidget::takeItem ( int row, int column ) Removes the item at row and column from the table without deleting it. |
||||
|
|||||
| SABROG |
|
||||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Эта функция очищает только содержимое ячеек, но никак не удаляет сами элементы. Используй void QTableWidget::clear () [slot] Если в чем-то не уверен - создай тестовый код:
В простейшем случае в Task Manager'e будет видно максимальное количество используемой памяти и текущее количество. Например у меня 100000*10 элементов занимает в памяти 150Мб, после clear() - 11Мб. Но я не доверяю Task Manager'у, поэтому использую детекторы утечек памяти такие как Valgrind (для Linux) и Rational Purify (для Windows). И вот что последний говорит:
Грубо говоря - утечек нет. |
||||
|
|||||
| brag |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 16.5.2009 Репутация: нет Всего: нет |
так я же передаю через ссылку. или вы предлагаете статически наклепать? статически не идет,тк коли-ество итемов разное.
QTableWidgetItem * QTableWidget::takeItem ( int row, int column ) Removes the item at row and column from the table without deleting it. написано же,что без удаления. попробую конечно Добавлено через 1 минуту и 25 секунд SABROG, спасибо! иду пробовать |
|||
|
||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
||||
|
||||
| brag |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 16.5.2009 Репутация: нет Всего: нет |
||||
|
||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Как-то обсуждали тему интересную тут |
|||
|
||||
| brag |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 16.5.2009 Репутация: нет Всего: нет |
спасибо,почитал! о этой штуке я и не знал. но пока не важно,хватит и привычных указателей, тк буду путаться
|
|||
|
||||
![]()
|
| Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |