QTableWidget内存是否泄漏?

时间:2014-02-24 19:24:53

标签: qt qtablewidget qtablewidgetitem

假设我有一个装满数据的二维数组,比如10 x 10.内容和行数可以随时更改。 现在我想在QTableWidget中显示这些数据。
我使用超时1秒的计时器来刷新表格内容。在超时槽中,如果我使用

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]);
}

使用新的TableWidgetItem让我很担心。我没有提及它,我从不删除它 在一段时间内这是一个内存泄漏,或者由Qt管理,请帮助......

4 个答案:

答案 0 :(得分:5)

没有泄漏,如

  

该表取得该项目的所有权。

(来自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,则还可以通过在valgrind中使用--leak-check = full运行上面的代码(没有第二个qDebug())来验证行为。

答案 1 :(得分:3)

来自Qt documentation

  

void QTableWidget :: setItem(int row,int column,QTableWidgetItem *   item)将给定行和列的项目设置为item。 表格   获得该项目的所有权。

这表明Qt将根据需要管理对象的内存。

答案 2 :(得分:1)

当您向单元格添加Q对象时,它将正确删除。 我在细胞中推着成千上万的C弦,看着我的记忆爆炸了。 制作我的原始文本数据&#34;一个QString,我的问题解决了。

答案 3 :(得分:0)

发生这样的问题是:Qt并没有真正清除通过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);
    }
}

此代码给出116个字节的泄漏。

我们找到了以下解决方案:您可以使用QLineEdit代替QTableWidgetItem:

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

p.s。要使用Dr.memory搜索泄漏