一些Qt函数/构造函数的参数的内存管理?

时间:2014-05-25 07:43:59

标签: c++ qt qtgui qtreewidget qtreewidgetitem

我想在按下按钮时将项目添加到QTreeWidget。我在我的程序中使用以下代码:

void MainWindow::on_training_addButton_clicked()
{
    countertest++;
    QStringList slist;
    slist << QString::number(countertest);
    ui->trainingDataTreeWidget->addTopLevelItem(new QTreeWidgetItem(slist)); //case 1

    //QTreeWidgetItem* item = new QTreeWidgetItem(slist); //case 2
    //ui->trainingDataTreeWidget->addTopLevelItem(item);
    //delete item;
}

在这两种情况下,我都为QTreeWidgetItem分配了动态内存。在第二种情况下,我将它传递给addTopLevelItem()后将其删除,但我担心Qt可能会在以后需要它。什么是正确的方法?

1 个答案:

答案 0 :(得分:1)

QTreeWidget析构函数将负责删除,因此类将处理项目的生命周期。只需删除外部删除即可。 IT会导致QTreeWidget尝试删除悬空指针,这将是众所周知的双重删除崩溃。

以下是文档和来源的证明:

文档

  

QTreeWidget::~QTreeWidget()

     

销毁树构件及其所有项目。

来源

/*!
  \internal

  Destroys this tree model.
*/

QTreeModel::~QTreeModel()
{
    clear();
    delete headerItem;
    rootItem->view = 0; 
    delete rootItem;
}

/*!
  \internal

  Removes all items in the model.
*/

void QTreeModel::clear()
{
    SkipSorting skipSorting(this);
    beginResetModel();
    for (int i = 0; i < rootItem->childCount(); ++i) {
        QTreeWidgetItem *item = rootItem->children.at(i);
        item->par = 0; 
        item->view = 0; 
        delete item;
    }    
    rootItem->children.clear();
    sortPendingTimer.stop();
    endResetModel();
}
相关问题