zoukankan      html  css  js  c++  java
  • QPointer的使用以及场景

    QPointer的使用以及场景

    在我们项目开发中,经常会遇到这种情况,在A中引用了B的对象,但是你却不知道B什么时候会析构,所以使用它会出现异常;所以今天的主角要登场了QPointer可以完美的解决这样的问题。

    先来看一下介绍

    The QPointer class is a template class that provides guarded pointers to QObject. A guarded pointer, behaves like a normal C++ pointer T *, except that it is automatically cleared when the referenced object is destroyed (unlike normal C++ pointers, which become “dangling pointers” in such cases).

    T must be a subclass of QObject.

    官方已经很清楚了,提炼一下,QPointer是一个模版类,指向的对象必须是QObject的派生类,声明的方式是OPointer<T> p1;

    下面看一下具体的代码

    QWidget* p1 = new QWidget();

        QWidget* p2 = p1;

        delete p1;

        p1 = Q_NULLPTR;

        qDebug()<<"delete p1";

        if(p2)

        {

            qDebug()<<"p2 is not NULL,p2 call show Widget";

            p2->show();

            qDebug()<<"Widget show";

        }

        else

        {

            qDebug()<<"p2 is NULL";

        }

    ————————————————

    运行结果

    delete pw

    pw2 is not NULL,pw2 call show Widget

    程序异常结束。

    这个结果说明当p1指向的对象被析构时,p2指向的对象自然时析构了(他们指向的同一个对象),但是p2的指针不是一个空指针,所一程序qDebug()<<“Widget show”;没有执行程序就Crash了。

    让我们把它改写成QPointer

    QWidget* p1 = new QWidget();

        QPointer<QWidget> p2 = p1;

        delete p1;

        p1 = Q_NULLPTR;

        qDebug()<<"delete p1";

        if(p2)

        {

            qDebug()<<"p2 is not NULL,p2 call show Widget";

            p2->show();

            qDebug()<<"Widget show";

        }

        else

        {

            qDebug()<<"p2 is NULL";

        }

    ————————————————

    运行结果

    delete p1

    p2 is NULL

    这个结果说明当p1指向的对象被析构时,p2的指针被置为空了,所以输出了“p2 is NULL";

    从这两段代码来看我们可以直观的了解到QPointer的用法以及使用场景,但是一定要注意的是指向的对象必须是继承于QObject,至于为什么大家可以看看源码,或者我有时间在写一下它的实现原理。

  • 相关阅读:
    数据分析师入门——用 Pandas 进行数据预处理:数据清洗与可视化
    hdu 1532 Dinic模板(小白书)
    二分图的最大匹配、完美匹配和匈牙利算法(转)
    HDU 1532 (Dinic算法)
    HDU 1532 Drainage Ditches EK算法 flod算法
    Edmonds_Karp 算法入门详解(转)
    UVa 10801
    Codeforces Round #359 (Div. 2)C
    Codeforces Round #358 (Div. 2)B. Alyona and Mex
    int long long范围
  • 原文地址:https://www.cnblogs.com/bruce1992/p/15015693.html
Copyright © 2011-2022 走看看