Qt C ++:从QListWidget中删除倒数第二个项目会导致程序崩溃

时间:2014-07-22 19:21:58

标签: c++ qt pointers crash

在此程序中,项目(markers)被添加到QListWidget calles ui->lwMarkers。也可以通过按“删除按钮”再次删除这些项目,该按钮调用以下功能

void Form::on_pbRemoveMarker_clicked()
{
    if (ui->lwMarkers->currentRow() < 0) return;

    delete ui->lwMarkers->takeItem(ui->lwMarkers->currentRow());
}

在函数内部,第一行是确保实际选择了一个项目(标记)。 第二行是(至少,我希望)删除所选项目。

添加和删除:一切顺利,除非您想要删除倒数第二个项目。不幸的是,它崩溃了。我不明白为什么。

有人能解释这个问题吗?

如果有帮助:完整代码来自qt-google-maps项​​目:https://code.google.com/p/qt-google-maps/。该项目使用Google Maps API v2,我将代码更改为使用v3。

我问的问题是他们代码的特定行为,我根本看不到崩溃的原因。有什么帮助吗?

崩溃总是发生在delete之前,我相信这是因为takeItem而我得到的错误如下:     QList :: operator []中的ASSERT失败:“索引超出范围”,文件../../QtSDK/Desktop/Qt/473/gcc/include/QtCore/qlist.h,第464行

1 个答案:

答案 0 :(得分:0)

可能是takeItem是恶人吗?根据{{​​3}},它从QListWidget中删除该项并返回它。它还提到:

  

从列表小部件中删除的项目不会由Qt管理,需要手动删除。

这就是为什么,对我来说,原始代码似乎是正确的,您从列表小部件中删除该项并在之后删除它。但是,当尝试删除倒数第二个项目时,它会给出上述错误。

我建议改用item()函数,并相应删除它:

void Form::on_pbRemoveMarker_clicked()
{
    if (ui->lwMarkers->currentRow() < 0) return;

    delete ui->lwMarkers->item(ui->lwMarkers->currentRow());
}

该程序的前端现在按预期工作,但是我是否以这种方式泄漏内存?

您可能会看到其他任何问题吗?