删除向量中的指针时出错

时间:2014-09-03 15:53:18

标签: c++ qt vector qlistview

我在尝试删除向量所拥有的指针时遇到了麻烦。在我的应用程序中,我有一个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];

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

编辑:我已经提出了一个与同一问题有关的问题 [Error using Qt and unique pointers

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

2 个答案:

答案 0 :(得分:2)

您实际上是第二次删除此索引处的QStandardItem。实际上,正如您在QStandardItemModel's function setItem

的Qt doc中的以下摘录中所看到的那样
  

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

QStandardItemModel管理您传递的所有QStandardItem,因此您绝不应尝试删除这些内容。

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

答案 1 :(得分:0)

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

相关问题