Qt 智能指针实例

#include 
#include 
#include 
#include 
#include 
class MyClass
{
public:
    MyClass():str("null")
    {}
    MyClass(const MyClass &rhs):str(rhs.str)
    {}
    MyClass &operator=(const MyClass &rhs)
    {
        if (this != &rhs)
            str = rhs.str;
        return *this;
    }
    ~MyClass()
    {
        qDebug() << "delete";
    }
    QString str;
};
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    qDebug() << "test qscopedptr";
    {
        QScopedPointer m(new MyClass);
    }
    qDebug() << "test qsharedptr";
    QSharedPointer s(new MyClass);
    QSharedPointer s1 = s;
    QWeakPointer w = s;
    qDebug() << w.data()->str;
    s.clear();
    qDebug() << "after s is cleared";
    qDebug() << w.data()->str;
    qDebug() << "try s, after s is cleared";
    if (s.isNull())
        qDebug() << "s is null";
    else
        qDebug() << s->str;
    s1.clear();
    if (w.isNull())
        qDebug() << "w is null";
    else
        qDebug() << "w still has the resource";
    return a.exec();
}

智能指针思考:

C++使用RAII来控制资源的获得与释放

一切的资源获得都是从new开始

那么如何保存并追踪这份资源呢?

如果是常规指针,当该指针所指向的资源被释放了,我们将不得而知

这会导致执行代码到这里时程序崩溃

所以就有了智能指针的出发点:当资源在某处释放时,你的指针变量能够自动赋值为null


scoped指针能够在指针变量声明周期结束时释放申请的资源,这与在栈上创建临时对象的效果一样

但这样做的好处也是很明显的,比如你想把该资源传到其他代码段,就可以用take方法来获得堆上的指针

这时就将原始指针(资源实际控制指针)传递出去,但同时你也要在使用完该资源后将其delete,并且这期间不能将该指针传给别的代码

使用scoped指针最有意义的是,你不用占用宝贵的函数栈空间,却能够获得同样的使用体验


shared指针是强指针,当该指针生命周期结束时,他不会释放自己的资源,这点很像原始指针

直到你调用clear时才会将自己所指向的真实指针赋值为null,但在此之前他会检查自己的引用计数,如果发现有其他的shared指针存在

则不会释放资源,直到最后一个shared指针clear之后,才会调用真正的delete


weak指针其实是智能指针真正要实现的目的,就是当资源释放后,你能够侦测到该指针为null

对于一个shared指针s

QWeakPointer<MyClass>w =s;

这是weak指针的唯一初始化方式

实际使用中应该是这样:

在类的成员中定义一个shared指针,然后不断的返回weak指针给外部调用

你可能感兴趣的:(c++,Qt)