Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [qt] выделение памяти и ее освобождение, item=new QTableWidgetItem(tr("aaa")); 
:(
    Опции темы
brag
Дата 16.5.2009, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 16.5.2009

Репутация: нет
Всего: нет



добрый день!
я в C++ не силен,тем более в QT. моя стихия - низкоуровневое програмирование smile
подскажите,плиз такую вещь:
если есть QTableWidget, в него надо напихать, скажем 1000записей.
как я понял,создается новый экземпляр обьекта QTableWidgetItem
item=new QTableWidgetItem(tr("aaa"));
и затем пихается в этот QTableWidget
ui.tableWidget->setItem(row,col,item);

а как быть с освобождением памяти? если,мне, скажем, нужно записать новые данные в таблицу?
я делал
tableWidget->clearContents();
tableWidget->setRowCount(0);
но по стату видно,что память, выделенная приложению растет.
те, получается,нужно так же в цикле доставать адреса всех итемов и освобождать?
или есть какие-то более красивые решения? даже в winapi простой listview можно освободить одним сообщением

за ренее,спасибо!
PM MAIL   Вверх
Remiznik
Дата 16.5.2009, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 379
Регистрация: 30.4.2005

Репутация: нет
Всего: 1



а попробовать использовать 

void QTableWidget::removeCellWidget ( int row, int column )

Removes the widget set on the cell indicated by row and column.

PM MAIL   Вверх
brag
Дата 16.5.2009, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 16.5.2009

Репутация: нет
Всего: нет



всеравно память растет :(
причем именно растет, а не выделяются ранее неиспользованные, но выделенные стртаницы.
я думал, тут все намного проще, а получается сложнее..мне на своем низком уровне нужно следить за выделением/освобождением, а тут надо ещ больше следить smile

Добавлено через 7 минут и 39 секунд
парится с очисткой не надо, достаточно 
tableWidget->setRowCount(0);
и оно прочистит. только сами обьекты остануться выделенными и будут накоплять память.
провервл.
с таблицей с данными делал
tableWidget->setRowCount(0);
tableWidget->setRowCount(2);
2 строки появились, но пустые.

прийдется писать метод для бегания по таблице и освобождения памяти
PM MAIL   Вверх
brag
Дата 16.5.2009, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 16.5.2009

Репутация: нет
Всего: нет



сварганил что-то подобное
Код

void MainFrm::freeTableWidget(QTableWidget *t){
    int i,j,r,c;
    c=t->columnCount();
    r=t->rowCount();
    for(i=0;i<r;++i){
        for(j=0;j<c;++j){
            delete t->item(i,j);
        }
    }
    t->setRowCount(0);
}

но память всеравно растет smile 
PM MAIL   Вверх
Remiznik
Дата 16.5.2009, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 379
Регистрация: 30.4.2005

Репутация: нет
Всего: 1



я не уверен а попробуй создавать QTableWidgetItem не динамически , а передовать через ссылку !
незнаю что получиться и реаьно ли вобше это !

Добавлено через 4 минуты
Цитата(brag @ 16.5.2009,  13:55)
сварганил что-то подобное
Код

void MainFrm::freeTableWidget(QTableWidget *t){
    int i,j,r,c;
    c=t->columnCount();
    r=t->rowCount();
    for(i=0;i<r;++i){
        for(j=0;j<c;++j){
            delete t->item(i,j);
        }
    }
    t->setRowCount(0);
}

но память всеравно растет smile

для удаления нужно брать итем !

QTableWidgetItem * QTableWidget::takeItem ( int row, int column )

Removes the item at row and column from the table without deleting it.
PM MAIL   Вверх
SABROG
  Дата 16.5.2009, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Цитата(brag @  16.5.2009,  12:07 Найти цитируемый пост)
я делал
tableWidget->clearContents();


Эта функция очищает только содержимое ячеек, но никак не удаляет сами элементы. Используй

void QTableWidget::clear ()   [slot]

Если в чем-то не уверен - создай тестовый код:

Код

#include <QtGui/QApplication>
#include <QtGui/QTableWidget>
#include <QtGui/QTableWidgetItem>

enum{RowCount=100000, ColumnCount=10};

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QTableWidget *tableWidget = new QTableWidget;
    tableWidget->setRowCount(RowCount);
    tableWidget->setColumnCount(ColumnCount);
    for (int i=0; i < RowCount; ++i) {
        for (int j=0; j < ColumnCount; ++j) {
            QTableWidgetItem *item = new QTableWidgetItem(QString("%0:%1")
                    .arg(i).arg(j));
            tableWidget->setItem(i, j, item);
        }
    }
    tableWidget->clear();
    tableWidget->show();
    return app.exec();
}



В простейшем случае в Task Manager'e будет видно максимальное количество используемой памяти и текущее количество. Например у меня 100000*10 элементов занимает в памяти 150Мб, после clear() - 11Мб. Но я не доверяю Task Manager'у, поэтому использую детекторы утечек памяти такие как Valgrind (для Linux) и Rational Purify (для Windows). И вот что последний говорит:

Цитата

[I] Summary of all memory leaks... {138 bytes, 3 blocks}
[I] MPK: Potential memory leak of 106 bytes from 1 block allocated in lock [MSVCRT.DLL]
        Offset 0x00000009 referenced by 0x028c4e50, a location in a malloc'd block
        Offset 0x00000009 referenced by 0x028c4d88, a location in a malloc'd block
        Distribution of potentially leaked blocks
               106 bytes from 1 block of 106 bytes (0x028c4d88)
        Allocation location
            malloc         [C:\WINDOWS\system32\MSVCRT.DLL]
            lock           [C:\WINDOWS\system32\MSVCRT.DLL]
[I] MPK: Potential memory leak of 32 bytes from 2 blocks allocated in ZN8QMapData11node_createEPPNS_4NodeEi [QTCORE4.DLL]
        Offset 0x00000008 referenced by 0x04399490, a location in a malloc'd block
        Offset 0x00000008 referenced by 0x043a88d4, a location in a malloc'd block
        Distribution of potentially leaked blocks
                32 bytes from 2 blocks of 16 bytes (first block: 0x04399500)
        Allocation location
            malloc         [C:\WINDOWS\system32\MSVCRT.DLL]
            ZN8QMapData11node_createEPPNS_4NodeEi [D:\WORK\TWITEMMEMLEAK\RELEASE\QTCORE4.DLL]


Грубо говоря - утечек нет.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
brag
Дата 16.5.2009, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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, спасибо!
иду пробовать smile
PM MAIL   Вверх
SABROG
Дата 16.5.2009, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Цитата(brag @  16.5.2009,  12:07 Найти цитируемый пост)
item=new QTableWidgetItem(tr("aaa"));
и затем пихается в этот QTableWidget
ui.tableWidget->setItem(row,col,item);


Это в каком месте тут у тебя ссылка?


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
brag
Дата 16.5.2009, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 16.5.2009

Репутация: нет
Всего: нет



утечки есть, но не большие... спасибо
у меня qt4. freebsd

Добавлено через 1 минуту и 8 секунд
Цитата(SABROG @  16.5.2009,  16:07 Найти цитируемый пост)
Это в каком месте тут у тебя ссылка?

QTableWidgetItem *item;
item=new QTableWidgetItem(tr("aaa"));
чем не ссылка?
PM MAIL   Вверх
SABROG
Дата 16.5.2009, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Цитата(brag @  16.5.2009,  16:15 Найти цитируемый пост)
QTableWidgetItem *item;
item=new QTableWidgetItem(tr("aaa"));
чем не ссылка? 


Как-то обсуждали тему интересную тут



--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
brag
Дата 17.5.2009, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 16.5.2009

Репутация: нет
Всего: нет



спасибо,почитал! о этой штуке я и не знал. но пока не важно,хватит и привычных указателей, тк буду путаться smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0488 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.