mas*_*oud 5 c++ qt memory-leaks memory-management
我知道在Qt中有很多关于内存管理的问题.我也读了这些问题:
但就我而言,我再次感到困惑!
我有一个QTableWidget名字myTable.我通过以下方式添加运行时小部件setCellWidget:
void MyClass::build()
{
for (int i=LOW; i<HIGH; i++)
{
QWidget *widget = new QWidget(myTable);
//
// ...
//
myTable->setCellWidget(i, 0, widget);
}
}
Run Code Online (Sandbox Code Playgroud)
然后,我删除所有项目,如下所示:
void MyClass::destroy()
{
for (int i = myTable->rowCount(); i >= 0; --i)
myTable->removeRow(i);
}
Run Code Online (Sandbox Code Playgroud)
这些方法在很长一段时间内多次调用.而且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);
}
}
Run Code Online (Sandbox Code Playgroud)
一般来说,如果对如何使用课程有疑问或困惑,请查阅本应附带的文档.幸运的是,QTableWidget::setCellWidget()事实上确实带有文档:
void QTableWidget :: setCellWidget(int row,int column,QWidget*widget)
设置要在给定行和列的单元格中显示的给定窗口小部件,将窗口小部件的所有权传递给表 [强调我的].如果单元格小部件A被单元格小部件B替换,则将删除单元格小部件A. 例如,在下面的代码片段中,将删除QLineEdit对象.
Run Code Online (Sandbox Code Playgroud)setCellWidget(index, new QLineEdit); ... setCellWidget(index, new QTextEdit);
在调用之后myTable->setCellWidget(),表现在拥有您传递给它的小部件.这意味着它myTable负责删除您传递给的小部件setCellWidget().delete w;在删除行时不需要执行此操作.你的第一个destroy()功能就足够了.
| 归档时间: |
|
| 查看次数: |
1212 次 |
| 最近记录: |