2012-02-07 2 views
0

Я пытаюсь подчеркнуть свою программу, которая в основном обновляется с разным количеством строк, которое QTableWidgetHeap использования в QTableWidget в Qt

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

Что я переживаю, так это то, что куча, отслеживаемая с моего монитора ресурсов, только увеличивается.

Это часть кода я бегу, когда я нажимаю кнопку в моем приложении:

MyClass::updateTable(int nrows) 
{ 
    ui->tableWidget->clearContents(); // this is to free the memory but the heap always grows 
    for (int i=0; i<nrows; i++) 
    { 
     // I don't like this new I don't know when the destructor is called here!! 
     QTableWidgetItem *item = new QTableWidgetItem(); 
     item->setText("SOMETEXT"); 
     ui->tableWidget->setItem(i,0,idItem); 
    } 
} 

количество строк, как указано в int nrows очень переменное число (от 10 до 10^5).

Как полностью очистить память от кучи?

+1

Было ли у вас «valgrind» приложение, чтобы увидеть, где вы просачиваетесь? – Karlson

+0

Я пытался «valgrind», но он не нашел больших утечек (часть тех очень маленьких утечек, связанных с использованием библиотек Qt, которые, вероятно, являются ложными срабатываниями). Я пробовал оба с 'ui-> tabWidget-> clearContents(); ui-> tabWidget-> clear(); 'и явно удаляя каждый элемент таблицы. Поведение такое же, valgrind заметил отсутствие утечек, но память, выделенная для O.S. остается большим. Почему? Как происходит распределение памяти в Linux? – linello

+0

Linux помещает освобожденную память в кешированный пул. Увеличивает ли ваш процесс RSS или VSIZE то, что вы видите? – Karlson

ответ

0

Это новое необходимо. Странно, что clearContents() должен избавиться от них. Другой функцией, которую вы можете использовать, является функция clear(), но единственная разница между этими двумя состоит в том, что ясность сначала удаляет заголовки, а затем вызывает clearContents(), который является фактическим удалением элементов.

В самом деле, посмотрите на код для этих функций:

void QTableModel::clear() 
{ 
    for (int j = 0; j < verticalHeaderItems.count(); ++j) { 
     if (verticalHeaderItems.at(j)) { 
      verticalHeaderItems.at(j)->view = 0; 
      delete verticalHeaderItems.at(j); 
      verticalHeaderItems[j] = 0; 
     } 
    } 
    for (int k = 0; k < horizontalHeaderItems.count(); ++k) { 
     if (horizontalHeaderItems.at(k)) { 
      horizontalHeaderItems.at(k)->view = 0; 
      delete horizontalHeaderItems.at(k); 
      horizontalHeaderItems[k] = 0; 
     } 
    } 
    clearContents(); 
} 

void QTableModel::clearContents() 
{ 
    for (int i = 0; i < tableItems.count(); ++i) { 
     if (tableItems.at(i)) { 
      tableItems.at(i)->view = 0; 
      delete tableItems.at(i); //Your item should get deleted here 
      tableItems[i] = 0; 
     } 
    } 
    reset(); 
} 

Вы уверены, что это, где вы утечка?

Смежные вопросы