Qt内存管理容器

时间:2012-02-05 13:28:02

标签: c++ qt memory-management memory-leaks

我知道在Qt中有很多关于内存管理的问题。我也读了这些问题:

但就我而言,我再次感到困惑!

我有一个名为QTableWidget的{​​{1}}。我通过myTable添加运行时小部件:

setCellWidget

然后,我删除了以下所有项目:

void MyClass::build()
{
    for (int i=LOW; i<HIGH; i++)
    {
        QWidget *widget = new QWidget(myTable);
        //
        // ...
        //
        myTable->setCellWidget(i, 0, widget);
    }
}

这些方法在很长一段时间内都会多次调用。而void MyClass::destroy() { for (int i = myTable->rowCount(); i >= 0; --i) myTable->removeRow(i); } 作为这些小部件的父级将沿着程序的生命周期生活。

剂量方法myTable完全自动释放内存?或者我必须自己destroy()分配小部件,如下所示?

delete

2 个答案:

答案 0 :(得分:5)

一般来说,如果对如何使用课程有疑问或疑惑,请查阅本应附带的文档。幸运的是,QTableWidget::setCellWidget() does in fact come with documentation

  

void QTableWidget :: setCellWidget(int row,int column,QWidget * widget)

     

设置要在窗格中显示的给定窗口小部件   给定行和列,将窗口小部件的所有权传递给   表格 [强调我的] 。如果单元格小部件A被单元格小部件B,单元格小部件替换   A将被删除。例如,在下面的代码片段中,   QLineEdit对象将被删除。

    setCellWidget(index, new QLineEdit);
    ...
    setCellWidget(index, new QTextEdit);

在调用myTable->setCellWidget()之后,该表现在拥有您传递给它的小部件。这意味着myTable负责删除您传递给setCellWidget()的小部件。在删除行时,您无需执行delete w;。您的第一个destroy()功能就足够了。

答案 1 :(得分:2)

来自the documentation

void QTableWidget::setCellWidget ( int row, int column, QWidget * widget )
     

将给定小部件设置为在给定行和列的单元格中显示,将小部件的所有权传递给表。

     

如果单元格小部件A被单元格小部件B替换,则将删除单元格小部件A.例如,在下面的代码片段中,将删除QLineEdit对象。

也就是说,您不会手动清理,因为资源的释放会自动发生在Qt对象树中,widget已成为其中的一部分。