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

Posted

技术标签:

【中文标题】某些 Qt 函数/构造函数的参数的内存管理?【英文标题】:Memory management for arguments to some Qt functions/constructors? 【发布时间】:2014-05-25 07:43:59 【问题描述】:

我想在按下按钮时向 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 以后可能需要它。解决这个问题的正确方法是什么?

【问题讨论】:

据我所知,一旦你将一个项目添加到树小部件中,树小部件就拥有它,并在树小部件被删除时将其删除。你不应该自己删除它。 感谢您的回答。我还有一个问题.. 如果我在没有delete item 的情况下使用第二种情况并再次按下按钮,item 指向的数据会被覆盖,对吧?那么会不会影响QTreeWidget的内容呢? 【参考方案1】:

QTreeWidget 析构函数将负责删除,因此类负责项目的生命周期。只需删除您的外部删除。它会导致 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();

【讨论】:

以上是关于某些 Qt 函数/构造函数的参数的内存管理?的主要内容,如果未能解决你的问题,请参考以下文章

QT/C++构造函数参数简单问题

缺少 QLayout 构造函数来实现卡片布局

Qt内存回收(转载)

Qt中的内存回收机制

如何强制调用某些构造函数/函数以使用命名参数?

在构造函数 QT Creator(继承类)中传递默认参数