QSharedPointer和QSharedDataPointer之间的区别?

pau*_*ons 13 c++ qt pointers qsharedpointer

这两种指针有什么区别?据我所知,QSharedPointer可以很好地处理情况,那么QSharedDataPointer需要什么?

pho*_*tom 6

从Qt文档 QSharedDataPointer

QSharedDataPointer类表示指向隐式共享对象的指针.QSharedDataPointer使您可以轻松编写自己的隐式共享类.QSharedDataPointer实现线程安全引用计数,确保将QSharedDataPointers添加到您的可重入类不会使它们不可重入.许多Qt类使用隐式共享来将指针的速度和内存效率与类的易用性结合起来.有关详细信息,请参阅"共享类"页面.

用法示例 -

 #include <QSharedData>
 #include <QString>

 class EmployeeData : public QSharedData
 {
   public:
     EmployeeData() : id(-1) { }
     EmployeeData(const EmployeeData &other)
         : QSharedData(other), id(other.id), name(other.name) { }
     ~EmployeeData() { }
Run Code Online (Sandbox Code Playgroud)

对于QSharedPointer

QSharedPointer类包含对共享指针的强引用QSharedPointer是C++中的自动共享指针.它的行为与普通指针完全相同,包括对constness的尊重.如果没有其他QSharedPointer对象引用它,QSharedPointer将在它超出范围时删除它所持有的指针.

>  QSharedPointer<MyObject> obj =
>          QSharedPointer<MyObject>(new MyObject);
Run Code Online (Sandbox Code Playgroud)

因此,QSharedDataPointer用于创建隐式共享类.而QSharedPointer是一个指向类的引用计数智能指针.


编辑

在Qt中阅读内存管理?,我发现这个链接http://blog.qt.io/blog/2009/08/25/count-with-me-how-many-smart-pointer-classes-does-qt-have/.关于Qt具有的不同智能指针的非常好的讨论(当前API有8个).

  • QSharedDataPointer用于在类的多个实例之间实现类数据的浅复制,即共享数据.参考文档显示了继承QSharedDataPointer的类.所以这对班级来说是内部的.QSharedPointer是类的EXTERNAL,它实现了一个指向类的单个实例的引用计数指针.所以它允许多个指针指向同一个类实例. (5认同)