【问题标题】:Qt C++ : removing next-to-last item from QListWidget makes program crashQt C++:从 QListWidget 中删除倒数第二项会使程序崩溃
【发布时间】:2014-07-22 19:21:57
【问题描述】:

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

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 行

【问题讨论】:

  • 您能确认ui-&gt;lwMarkers-&gt;currentRow() 没有从1 回到N,其中N 是行数吗?如果是这种情况,您必须从 currentRow() 中减去一个以用于拍摄项目。
  • ( 我之前的评论写错了,删除了,这里是正确的信息: ) qt-project.org/doc/qt-4.8/qlistwidget.html#currentRow-prop : 实际上,currentRow() 返回 0 到 N- 1 当一行被激活/选中时。当没有行处于活动/选择状态时,它返回-1(因此if-test)

标签: c++ qt pointers crash


【解决方案1】:

莫非takeItem是恶人?根据 class reference ,它从 QListWidget 中删除该项目并返回它。它还提到:

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

这就是为什么,对我来说,原始代码似乎是正确的,您从列表小部件中删除该项目并随后将其删除。尽管如此,在尝试删除倒数第二项时,它仍然会出现上述错误。

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

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

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

程序的前端现在按预期工作,但我是否会这样留下内存泄漏?

您可能会发现其他问题吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-22
    • 2023-03-11
    相关资源
    最近更新 更多