zoukankan      html  css  js  c++  java
  • 到底有多少种智能指针(smart pointer)

    最近Qt的blog总结了到底有多少种smart pointer, 下面是一个简要的介绍:

    1.   QPointer :提供对指针的保护,当一个指针被删除以后,再使用不会造成野指针或者指针溢出。比如

    QPointer<MyObj> obj …;
    if(!obj.isNull()) obj->foo;// 成功
    … //对象被另外一个线程删除了
    if(!obj.isNull()) obj->foo;// 不会造成内存错误,该函数不会被调用

    (2009/10/27更正:需要加入if(!obj.isNull()) 进行判断,多谢linkerlin指出)

    2.   QSharedDataPointer:提供对数据的COPY-ON-WRITE,提供对数据(注:请区别于指向数据的指针)的线程安全的保护。(注:提供对数据的线程安全保护要结合QsharedData来完成)

    3.   QExplicitlySharedDataPointer:类似tr1::shared_ptr,提供对数据的线程安全的保护

    4.   QtPatternist::AutoPtr (internal class):其实现的功能已经完全被后面的QscopedPointer替代。

    5.   QSharedPointer:类似tr1::shared_ptr,也可以提供线程安全保护,与QSharedDataPointer不同的是,线程安全的保护仅限于指针而不是指针所指的对象数据。

    6.   QWeakPointer:类似tr1::weak_ptr伴随QsharedPointer产生,可以提供比QPointer更好的性能

    7.   QGuard (internal class): 内部类,主要用来替换QPointer而实现更好的性能

    8.   QScopedPointer:类似tr1::auto_ptr,可以很方便的实现RAII,而且提供了一个可以定制的deallocator, 因此使用auto_ptr但是苦于没有办法用delete[]的同学们就有福了。

    当然你或许会问为什么不用tr1, boost。这个问题也在blog中被回答了,因此Qt是一个跨平台的库,不能保证每个平台上的编译器都实现了tr1,比如Sun Studio compiler on Solaris (Sun Studio 12, with CC 5.10)仍然只支持C++98以前的标准。当然,还有其他的很多原因,比如风格/缺失某些属性之类的。

    需要看详细的内容请到这里:http://labs.trolltech.com/blogs/2009/08/25/count-with-me-how-many-smart-pointer-classes-does-qt-have/

    http://blog.csdn.net/aladdina/article/details/4539186

  • 相关阅读:
    【POJ 2778】DNA Sequence
    【POJ 2923】Relocation
    codeforces 475D
    hdu4742
    hdu4741
    hdu5016
    poj3929
    Codeforces Round #267 (Div. 2)
    codeforces 455E
    hdu4073 Lights
  • 原文地址:https://www.cnblogs.com/findumars/p/8298911.html
Copyright © 2011-2022 走看看