Qt提供了很多智能指针的类,比较常见的有QPointer, QSharedDataPointer ,QSharedPointer,QWeakPointer和QScopedPointer等等,它们被引入的Qt版本即描述如下:
-
(4.0) 已经过时,可以被QWeakPointer所替代,它不是线程安全的。
-
(4.0) -- 提供对数据的COPY-ON-WRITE以及浅拷贝,提供对数据(而不是指向数据的指针)的线程安全的保护。(注:提供对数据的线程安全保护要结合QsharedData来完成),它是线程安全的。
-
(4.5) -- 实现了引用计数的可共享资源的强类型指针,它是线程安全的。
-
(4.5) -- 实现了引用计数的可共享资源的弱类型指针,它是线程安全的。
-
(4.6) -- 实现了非引用计数的独享资源的强类型指针,它是线程安全的。
strong pointer : 在有它所指向的资源的所有权期间,永远不会放弃这个所有权。
weak pointer:在有它所指向的资源的所有权期间,允许外界释放其资源从而使其放弃这个所有权。
QSharedPointer有着与std::auto_ptr类似的特性,而最大的区别在于它不能转让所有权而auto_ptr可以。事实上,scoped_ptr永远不能被复制或被赋值!
下面代码使用QSharedPointer,QWeakPointer和QScopedPointer的示例:
-
int main(int argc, char *argv[])
-
{
-
QCoreApplication a(argc, argv);
-
//raw pointer
-
QString *p = new QString("hello");
-
//Implements non-reference-counted strong pointer
-
QScopedPointer pScopedPointer(new QString("Scoped"));
-
// Build error, can NOT be shared and reference-counted
-
//QScopedPointer pScopedPointer2 = pScopedPointer;
-
//Implements reference-counted strong sharing of pointers
-
QSharedPointer pSmart(new QString("Smart"));
-
QSharedPointer pSmart2;
-
pSmart2 = QSharedPointer(new QString("smart 2"));
-
QSharedPointer pSharedPoninter;
-
// can be shared safely and reference-counted
-
pSharedPoninter = pSmart;
-
qDebug() << *(pSmart.data());
-
qDebug() << *(pSmart2.data());
-
qDebug() << *(pSharedPoninter.data());
-
QTimer *timer = new QTimer();
-
QWeakPointer pWeakPointer = timer;
-
//Weak pointer's resources can be deleted from outside world
-
delete timer;
-
if (pWeakPointer.isNull())
-
{
-
qDebug() << "contained QObject has been deleted";
-
}
-
}
如下连接是一篇有关Qt智能指针很好的文章,
https://blog.qt.digia.com/blog/2009/08/25/count-with-me-how-many-smart-pointer-classes-does-qt-have/
阅读(2611) | 评论(0) | 转发(0) |