Chinaunix首页 | 论坛 | 博客
  • 博客访问: 371924
  • 博文数量: 50
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 641
  • 用 户 组: 普通用户
  • 注册时间: 2014-05-09 22:35
个人简介

不怕你失败,就怕你爬不起来。

文章分类

全部博文(50)

文章存档

2014年(50)

我的朋友

分类: C/C++

2014-09-10 00:01:51

Qt提供了很多智能指针的类,比较常见的有QPointer, QSharedDataPointer ,QSharedPointer,QWeakPointer和QScopedPointer等等,它们被引入的Qt版本即描述如下:

  1.  (4.0)  已经过时,可以被QWeakPointer所替代,它不是线程安全的。
  2.  (4.0)  -- 提供对数据的COPY-ON-WRITE以及浅拷贝,提供对数据(而不是指向数据的指针)的线程安全的保护。(注:提供对数据的线程安全保护要结合QsharedData来完成),它是线程安全的。
  3.  (4.5)    -- 实现了引用计数的可共享资源的强类型指针,它是线程安全的。
  4.  (4.5)      -- 实现了引用计数的可共享资源的弱类型指针,它是线程安全的。
  5.  (4.6)   -- 实现了非引用计数的独享资源的强类型指针,它是线程安全的。

strong pointer   在有它所指向的资源的所有权期间,永远不会放弃这个所有权。 

weak pointer在有它所指向的资源的所有权期间,允许外界释放其资源从而使其放弃这个所有权。 

QSharedPointer有着与std::auto_ptr类似的特性,而最大的区别在于它不能转让所有权而auto_ptr可以。事实上,scoped_ptr永远不能被复制或被赋值!

 

下面代码使用QSharedPointer,QWeakPointer和QScopedPointer的示例:

 


  1. int main(int argc, char *argv[])  
  2. {  
  3.     QCoreApplication a(argc, argv);  
  4.     //raw pointer  
  5.     QString *p = new QString("hello");  
  6.     //Implements non-reference-counted strong pointer  
  7.     QScopedPointer pScopedPointer(new QString("Scoped"));  
  8.     // Build error, can NOT be shared and reference-counted  
  9.     //QScopedPointer pScopedPointer2 = pScopedPointer;  
  10.     //Implements reference-counted strong sharing of pointers  
  11.     QSharedPointer pSmart(new QString("Smart"));  
  12.     QSharedPointer pSmart2;  
  13.     pSmart2 = QSharedPointer(new QString("smart 2"));  
  14.     QSharedPointer pSharedPoninter;  
  15.     // can be shared safely and reference-counted  
  16.     pSharedPoninter = pSmart;  
  17.     qDebug() << *(pSmart.data());  
  18.     qDebug() << *(pSmart2.data());  
  19.     qDebug() << *(pSharedPoninter.data());  
  20.     QTimer *timer = new QTimer();  
  21.     QWeakPointer pWeakPointer = timer;  
  22.     //Weak pointer's resources can be deleted from outside world  
  23.     delete timer;  
  24.     if (pWeakPointer.isNull())  
  25.     {  
  26.         qDebug() << "contained QObject has been deleted";  
  27.     }  
  28. }  
 

如下连接是一篇有关Qt智能指针很好的文章, 

https://blog.qt.digia.com/blog/2009/08/25/count-with-me-how-many-smart-pointer-classes-does-qt-have/

阅读(2611) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~