智能指针类模板(中)——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;
}
复制代码

原文地址:https://www.cnblogs.com/bruce1992/p/14321654.html