繁体   English   中英

如何在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是否存在。 如果单击两次清除,程序将直接崩溃。 如果未创建模型,请单击“清除”,程序直接崩溃。

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

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

实际上,您实际上是在检查是否存在model ,如果model != nullptr表示此指针指向实际对象。 如果要重置“模型”对象,只需在删除另一个对象后创建一个新对象:

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

如果要删除它并继续进行正确的检查,只需将指针设置为nullptr

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

刚刚成立的指针在构造函数和为null clear删除后。

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

您无法测试任意指针是否有效,但您的clear model应为“ null” model以表明已被删除:

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

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM