删除矢量中的指针时出错

Error deleting a pointer in a vector

本文关键字:指针 出错 删除      更新时间:2023-10-16

我在尝试删除由向量拥有的指针时遇到问题。在我的应用程序中,我有一个QListView,我根据指针向量存储新项目。这是声明:

private:
vector<QStandardItem *> item; 
QStandardItemModel* model = new QStandardItemModel();

我简化了它,但它是一个类的属性。要添加新项目,我使用以下代码:

this->item.push_back(new QStandardItem());
for (unsigned long i = 0; i != this->item.size(); ++i) {
    this->item[i]->setCheckable( true );
    this->item[i]->setCheckState( Qt::Checked );
    this->item[i]->setText( "Current " + QString::number(i) );
    this->model->setItem( i, this->item[i] );
    ui->listView->setModel( model );
}

这工作得很好。现在我正在尝试添加一个删除按钮,该按钮可删除 QListView 上的当前索引。这是我到目前为止编写的代码:

QModelIndex index = ui->listView->currentIndex();
int deleteIndex = index.row();
this->model->removeRow(deleteIndex);
delete this->item[deleteIndex];
this->item.erase(this->item.begin() + deleteIndex);

对于我在StackOverflow上搜索的内容,该行

delete this->item[deleteIndex];

应该可以工作,但是每次按下删除按钮时都会遇到应用程序崩溃。没有该行,按钮工作正常,问题是我没有解除分配该项目使用的内存。

编辑:我已经提出了一个与同一问题有关的问题。
[使用 Qt 和唯一指针时出错

现在我想知道我是否尝试删除指针两次,这就是我收到错误的原因。问题是我对 c++ 和 qt 的了解不是很高。

您实际上是第二次删除此索引中的QStandardItem。事实上,正如你在以下摘自Qt文档中QStandardItemModel函数setItem

将给定行和列的项目设置为项目。模型取得物料的所有权。如有必要,将增加行计数和列计数以适合项目。删除给定位置的上一项(如果有(。

QStandardItemModel管理您将传递的任何QStandardItem,因此您永远不应尝试删除这些内容。

根据经验,当您不确定时,请查看Qt文档,了解您传递QObject的任何函数。如果它说它拥有所有权,那么永远不要删除它。

我所知,Qt通过父子关系管理对象的生命周期,并自动删除子对象。至少在我使用它时是这种情况。考虑到这一点,我认为这里不需要手动内存管理,因为该项目将被Qt删除。