zoukankan      html  css  js  c++  java
  • 智能指针类模板(中)——Qt中的智能指针

    Qt中的智能指针
    -QPointer
      .当其指向的对象被销毁时,它会被自动置空
      .析构时不会自动销毁所指向的对象
    -QSharedPointer
      .引用计数型智能指针
      .可以被自由的拷贝和赋值
      .当引用计数为0时才删除指向的对象

    #include <QPointer>
    #include <QDebug>
    
    using namespace std;
    
    class Test : public QObject //在进行Qt开发时,所定义的类都必须继承自Qt中的顶层父类QObject,这样才符合Qt开发中的一些规范。
    
    {
        QString m_name;
    public:
        Test(const char* name)
        {
            qDebug() << "Test(const char* name)" << endl;
            m_name = name;
        }
        void print()
        {
            qDebug() << "I'm" << m_name << endl;
        }
        ~Test()
        {
            qDebug() << "~Test()" << endl;
        }
    };
    
    int main()
    {
    
        QPointer<Test> pt(new Test("hello world") );
        pt->print();
        qDebug() << "pt= " << pt << endl;  
        return 0;
    }

     析构函数没有被调用,意味着pt这个智能指针对象,它在生命周期结束时并没有同时的销毁所指向的堆空间里面的对象。一定要注意。此时需要手工的删除。

    delete pt;

    #include <QPointer>
    #include <QDebug>
    
    using namespace std;
    
    class Test : public QObject //在进行Qt开发时,所定义的类都必须继承自Qt中的顶层父类QObject,这样才符合Qt开发中的一些规范。
    
    {
        QString m_name;
    public:
        Test(const char* name)
        {
            qDebug() << "Test(const char* name)" ;
            m_name = name;
        }
        void print()
        {
            qDebug() << "I'm" << m_name;
        }
        ~Test()
        {
            qDebug() << "~Test()" ;
        }
    };
    
    int main()
    {
    
        QPointer<Test> pt(new Test("hello world") );
        QPointer<Test> pt1(pt);
        QPointer<Test> pt2(pt);
    
        pt->print();
        pt1->print();
        pt2->print();
    
        delete pt;
    
        qDebug() << "pt= " << pt;
        qDebug() << "pt1= " << pt1 ;
        qDebug() << "pt2= " << pt2 ;
    
        return 0;
    }

     打印结果说明:

    意味着QPointer类模板的对象所指向的堆空间,如果被释放了,那么所有指向这个堆空间的智能指针都会被置空。这是一个非常有用的特性,可以避免内存多次释放的问题。

    QSharePointer的使用

    #include <QSharedPointer>
    #include <QDebug>
    
    using namespace std;
    
    class Test : public QObject //在进行Qt开发时,所定义的类都必须继承自Qt中的顶层父类QObject,这样才符合Qt开发中的一些规范。
    
    {
        QString m_name;
    public:
        Test(const char* name)
        {
            qDebug() << "Test(const char* name)" ;
            m_name = name;
        }
        void print()
        {
            qDebug() << "I'm" << m_name;
        }
        ~Test()
        {
            qDebug() << "~Test()" ;
        }
    };
    
    int main()
    {
        QSharedPointer<Test> pt(new Test("hello world") );
        pt->print();
    
        QSharedPointer<Test> pt1(pt);
        QSharedPointer<Test> pt2(pt);
        pt1->print();
        pt2->print();
    
        return 0;
    }

  • 相关阅读:
    R语言:随机抽样(sample函数)
    SNP (Single Nucleotide Polymorphism), SNV ( single nucleotide variants ) , Indel (insertion-deletion) 的区别
    剑指offer五十六之删除链表中重复的结点
    剑指offer五十五之链表中环的入口结点
    剑指offer五十四之字符流中第一个不重复的字符
    剑指offer五十三之表示数值的字符串
    剑指offer五十二之正则表达式匹配
    剑指offer五十一之构建乘积数组
    求游戏晋级花费的宝石的期望
    剑指offer五十一之构建乘积数组
  • 原文地址:https://www.cnblogs.com/-glb/p/12007974.html
Copyright © 2011-2022 走看看