QTableWidget memory leak or not?

Suppose I have a 2D array full of data, for example 10 x 10. The contents, as well as the number of lines, can change at any time. Now I want to display this data in a QTableWidget.
I use a 1sec timer to update the contents of the table. In the timeout slot, if I use

void slot_timeOut()
{
    //Iterate over the rows
    //and for each cell do something like
    ui->tw_data->setItem(row, 0, new TableWidgetItem(data[row][0]);
    ui->tw_data->setItem(row, 0, new TableWidgetItem(data[row][1]);
    //...
    ui->tw_data->setItem(row, 0, new TableWidgetItem(data[row][9]);
}

using the new TableWidgetItem bothers me. I have no link to it, and I never delete it.
For some time this is a memory leak, or it is managed by Qt, pls help ...

+4
source share
4 answers

No leak since

The table assumes responsibility for the item.

(From QTableWidget :: setItem () ).

, QTableWidget , , QTableWidget . Qt ( , , Qt).

setItem() , QTableWidgetItem :

int main(int argc, char** argv)
{
    QApplication app(argc, argv);
    QTableWidget widget(2, 1);
    QTableWidgetItem* foo = new QTableWidgetItem("Foo");
    widget.setItem(0, 0, foo);
    qDebug() << foo->text(); //works
    widget.setItem(0, 0, new QTableWidgetItem("Bar")); //replaces foo with bar and deletes foo
    qDebug() << foo->text(); // Undefined (usually, crash)
    widget.show();
    return app.exec();
}

Linux, , ( qDebug()) valgrind -leak-check = full.

+5

Qt :

void QTableWidget:: setItem (int row, int column, QTableWidgetItem * item) . .

, Qt .

+3

It will be correctly deleted when Q-objects are added to cells. I pushed thousands of C-lines in cameras and watched my memory explode. QString made my raw text data and my problem was resolved.

+1
source

Such a problem occurs: Qt does not really clear the memory allocated through QTableWidgetItem.

for( int row = 0; row < 35; row++)
{
    for(int i = 0; i < 9; i++)
    {
        QTableWidgetItem* item = new QTableWidgetItem();
        item->setText(QString::number(i));
        ui->tableWidget->setItem(row, i, item);
    }
}

This code gives 116 bytes of leak.

We found this solution: instead of QTableWidgetItem you can use QLineEdit:

 QLineEdit* tableline = new QLineEdit();
 m_qtablewidget->setCellWidget(row, column, tableline);

PS For search of leaks used Dr.memory

0
source

All Articles