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

时间:2015-11-26 08:37:15

标签: c++ qt delete-operator

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

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

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

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

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

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

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

5 个答案:

答案 0 :(得分:3)

您正在删除第一次通话中的model对象,显然是在第二次通话中它因为您尝试呼叫已删除的对象而崩溃。

事实上,如果model存在,那么你实际上是在chekcing,如果model != nullptr意味着这个指针指向一个实际的对象。 如果您想重置'模型'对象只是在删除另一个后创建一个新对象:

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

如果您想删除它并继续正确检查,只需将指针设置为nullptr

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

答案 1 :(得分:2)

只需在构造函数中将指针设置为null,并在删除后将其设置为clear

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

答案 2 :(得分:2)

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

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

请注意,它对delete空指针有效。

答案 3 :(得分:0)

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

a)在类构造函数中初始化model指针,

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

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

答案 4 :(得分:0)

I would suggest start using smart pointers. There are many options to check if the pointer exists.

C++11标准中还有许多其他智能指针以及Qt中的很多指针(这是一个很旧的链接,但信息仍然有效)。