Управление памятью для аргументов некоторых функций / конструкторов Qt?

Я хочу добавить элементы в 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

Решение

Деструктор 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();
}
1

Другие решения


По вопросам рекламы [email protected]