【发布时间】: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