QTableWidget是否存在内存泄漏问题?

9
假设我有一个二维数组,里面充满了数据,比如是10x10。这个内容和行数都可以随时改变。现在我想把这些数据显示在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个回答

9

没有泄漏,因为

该表格拥有该项。

(来自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中运行上述代码(不包括第二个qDebug())并加上"--leak-check=full"参数来验证其行为。

4

来自Qt 文档:

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

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


2

当您将Q-对象添加到单元格中时,它将正确删除。 我曾经向单元格中推送了成千上万个C字符串,并观察到我的内存飙升。 将我的“原始文本数据”设为QString,问题得以解决。


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个字节。

我们找到了一个解决方案:不要使用QTableWidgetItem,可以使用QLineEdit代替:

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

p.s. 搜索泄漏可使用 Dr.memory


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接