Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Общие вопросы _ QTableView очистка памяти

Автор: mevn 24.12.2013, 12:40

Добрый день.
Не подскажете ли, как можно решить следующую проблему.
Имеется таблица

class SqlDBTbl : public QObject
{
    Q_OBJECT
protected:
    QStandardItemModel    model;               ///< модель для хранения данных
    QItemSelectionModel    sel_model;           ///< модель для управления выделением записей
    QTableView            *table;               ///< таблица для отображения данных
...

Данная таблица заполняется данными.
Необходимо чистить память занимаемую этой таблицей. Пробовал так
        if(table)
    {
    
        while (model.rowCount())
        {    
            for(int ii = 0; ii< model.columnCount();ii++ )
            {
                delete model.item(0,ii);
        
            }
            model.removeRow(0 );
        }
        model.clear();
        table->setModel(&model);
        table->reset();
    
    }

Таблица очищается память не высвобождается

Автор: Litkevich Yuriy 26.12.2013, 19:03

Цитата(mevn @ 24.12.2013, 14:40) *
Таблица очищается память не высвобождается

2) Qt не всегда возвращает память ОС (чтобы в следующий раз её не запрашивать);
3) ОС не всегда забирает высвободившуюся память у приложения в кучу (а вдруг приложение опять начнёт просить выделить память).
Посему простейшие средства оценки, типа диспетчера задач, для отслеживания подобных ситуаций не годятся.


во-первых:
прокрути цикл (в голове или на бумаге), какой элемент ты удаляешь во второй проход, в третий, ... ?
(не забывай, что с каждым циклом у тебя кол-во элементов уменьшается)

Автор: mevn 27.12.2013, 18:26

Цитата(Litkevich Yuriy @ 26.12.2013, 20:03) *
Цитата(mevn @ 24.12.2013, 14:40) *
Таблица очищается память не высвобождается

2) Qt не всегда возвращает память ОС (чтобы в следующий раз её не запрашивать);
3) ОС не всегда забирает высвободившуюся память у приложения в кучу (а вдруг приложение опять начнёт просить выделить память).
Посему простейшие средства оценки, типа диспетчера задач, для отслеживания подобных ситуаций не годятся.


во-первых:
прокрути цикл (в голове или на бумаге), какой элемент ты удаляешь во второй проход, в третий, ... ?
(не забывай, что с каждым циклом у тебя кол-во элементов уменьшается)



Спасибо, что сказали).
Это реальное решение проблемы. Бился над ней пару дней (правда решил до Вашего ответа, но все равно СПАСИБО!!! Вы правы).
Обнаружил возврат памяти, когда загрузил компмемори по полной (несколько виртуальных машин, плюс все все все, процнетов на 96)
После этого все заработало как ожидальсь...


Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)