【问题标题】:Delete pointers from a map从地图中删除指针
【发布时间】:2013-03-31 09:04:36
【问题描述】:

有一个映射,它将int 映射到Test*

所有Test* 指针都在之前分配,然后分配给映射。然后,我将 deleteing 映射的值设置为 null

之后,它检查one 的有效性,它应该是null但是one 不是null

#include <QString>
#include <QMap>
#include <QDebug>

class Test {
    QString name;
public:
    Test(const QString &name) : name(name) {}
    QString getName() const { return name; }
};

int main() {
    QMap<int, Test*> map;

    Test *one = new Test("one");
    Test *two = new Test("two");
    Test *three = new Test("three");

    map.insert(1, one);
    map.insert(2, two);
    map.insert(3, three);

    for (auto itr = map.begin(); itr != map.end(); itr++) {
        Test *x = *itr;
        if (x) {
            delete x;
            x = 0; // ** Sets null to the pointer ** //
        }
    }

    if (one) // ** Here one is not 0 ?! ** //
        qDebug() << one->getName() << endl; // ** And then here crashes ** //
}

我想,当我在循环中deleteing 他们时,我错过了一些东西。

如何解决?

第二个问题是,deletes 分配的指针是否正确?

【问题讨论】:

    标签: c++ qt


    【解决方案1】:

    在循环中,变量x 是仅在循环内部的局部指针。当您将其设置为 NULL 时,您实际上并未将任何 other 指针设置为 NULL

    您应该将通过取消引用迭代器返回的引用设置为NULL

    *itr = nullptr;
    

    这将使映射中的指针为NULL,但其他指针仍将指向现在已释放的内存区域。


    当你有两个指针时,它看起来像这样:

    +-----+ |一个 | ---\ +-----+ | +---------------+ >--> |测试实例 | +-----+ | +---------------+ | x | ---/ +-----+

    如果你设置 一个 指针,它看起来像这样:

    +-----+ |一个 | ---\ +-----+ | +---------------+ >--> |测试实例 | +-----+ +--------------+ | x | +-----+

    变量xNULL,但变量one 仍然指向对象。如果对象已被删除,那么取消引用该指针将导致 未定义的行为

    【讨论】:

    • 谢谢,我更新了问题,我的第二个问题怎么样。
    • 可能在第二个问题中,您问的是这些指针指向的内存是否已被释放。当使用指针调用 delete 时,它​​正在释放指向的内存。因此,当您尝试进一步访问它时,会导致“分段错误”。因为变量“one”变成了一个悬空指针。
    • @Atique:是的,谢谢,怀疑 Qt,我错过了这个关于指针的简单问题。
    【解决方案2】:

    删除所有内容的最简单方法是:

    qDeleteAll(map);
    

    【讨论】:

      猜你喜欢
      • 2016-02-01
      • 2013-12-29
      • 1970-01-01
      • 1970-01-01
      • 2013-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多