[英]Qt memory management for containers
我知道在Qt中有很多关于内存管理的问题。 我也读了这些问题:
但就我而言,我再次感到困惑!
我有一个名为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
作为这些小部件的父母将按照程序的生命周期生活。
剂量方法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);
}
}
一般来说,如果对如何使用课程有疑问或困惑,请查阅本应附带的文档。 幸运的是, QTableWidget::setCellWidget()
实际上带有文档 :
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()
函数就足够了。
从文档 :
void QTableWidget::setCellWidget ( int row, int column, QWidget * widget )
设置要在给定行和列的单元格中显示的给定窗口小部件,将窗口小部件的所有权传递给表。
如果单元格小部件A被单元格小部件B替换,则将删除单元格小部件A. 例如,在下面的代码片段中,将删除QLineEdit对象。
也就是说,您不会手动清理,因为资源的释放会自动发生在Qt对象树中,您的widget
已成为其中的一部分。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.