如何在qt中删除之前检查指针是否存在

How to check for existence of a pointer before delete in qt

我正在使用 QAbstractTableModel。该模型在其中保存数据。它是在用户点击时创建和删除的。

这是用户点击创建模型后连接的插槽:

void clicked(){
    model = new QAbstractTableModel(data);
    model->setManyThings();
}

这是用户点击清除模型后连接的插槽:

void clear(){
    if (model != nullptr)
        delete model;
}

但是,这不能检查model是否存在。如果我点击两次清除程序直接崩溃。如果我点击clear没有创建模型,程序直接崩溃

那么如何检查模型是否存在

您在第一次调用时删除了 model 对象,显然在第二次调用中它崩溃了,因为您试图调用一个已经删除的对象。

事实上,你实际上是在检查model是否存在,如果model != nullptr意味着这个指针指向一个实际的对象。 如果要重置 'model' 对象,只需在删除另一个对象后创建一个新对象:

void clear(){
    if (model != nullptr)
    {
        delete model;
        model = new QAbstractTableModel(data);
    }
}

如果您只想删除它并继续进行适当的检查,只需将指针设置为 nullptr:

void clear(){
    if (model != nullptr)
    {
        delete model;
        model = nullptr;
    }
}

只需要在构造函数中和删除后clear中设置指针为null即可

更好的是,使用智能指针。

要处理这种情况,您必须关心 model 指针的值。以下是几个步骤:

a) 在您的 class 构造函数中初始化了 model 指针,

b) 将model指针值删除后设置为null,即:

void clear() {
    if (model != 0) {
        delete model;
        model = 0;
    }
}

您无法测试任意指针是否有效,但您的 clear 应该 "null" model 表明它已被删除:

void clear(){
    delete model;
    model = nullptr;
}

请注意,delete空指针是有效的。

我建议开始使用智能指针。有很多选项可以检查指针是否存在。

  • 由于您使用的是 Qt,请查看 QPointer for QObject based classes。
    • 如果对象被删除,该指针将自身重置为 0,因此您不需要实现宏或您自己的 class。
  • 如果您使用的是 c++11,请使用 [std::shared_ptr]。 (http://en.cppreference.com/w/cpp/memory/shared_ptr) 因为如果对象被删除,它也会将自己设置为 nullptr

C++11 standard as well as a lot in Qt中还有很多其他的智能指针(这个比较老了link,但是资料还是有效的)