【问题标题】:Qt memory management for containers容器的 Qt 内存管理
【发布时间】:2012-02-27 07:24:35
【问题描述】:

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

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

我有一个名为myTable 的QTableWidget。我通过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 作为这些小部件的父级,将随着程序的生命周期而存在。

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

void MyClass::destroy2() // This maybe causes to crash !!
{
    for (int i = myTable->rowCount(); i >= 0; --i)
    {
        QWidget *w = myTable->cellWidget(i, 0);
        delete w;
        myTable->removeRow(i);
    }
}

【问题讨论】:

  • 永远不要使用delete 直接删除小部件。小部件对象的资源仍然可以被底层窗口系统引用,如果窗口系统稍后尝试访问这些资源,则会导致您的应用程序崩溃。始终使用“deleteLater()”方法,一旦窗口系统不再引用该窗口小部件,Qt 就会删除它。

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


【解决方案1】:

一般来说,当对如何使用类有疑问或困惑时,请查阅本应随附的文档。幸好QTableWidget::setCellWidget() does in fact come with documentation:

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

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

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

在调用myTable-&gt;setCellWidget() 之后,表现在拥有您传递给它的小部件。这意味着myTable 负责删除您传递给setCellWidget() 的小部件。删除行时不需要delete w;。你的第一个destroy() 函数应该足够了。

【讨论】:

    【解决方案2】:

    来自the documentation:

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

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

    如果将单元格小部件 A 替换为单元格小部件 B,则单元格小部件 A 将被删除。比如下面的sn-p代码中,QLineEdit对象就会被删除。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-30
      • 2011-01-30
      • 2014-06-02
      • 1970-01-01
      • 2015-02-05
      • 2012-03-19
      • 1970-01-01
      相关资源
      最近更新 更多