类别:
QSharedPointer
QScopedPointer
QScopedArrayPointer
QWeakPointer
QPointer
QSharedDataPointer
QSharedPointer:
类比 std::shared_ptr
QScopedPointer:
类比 std::unique_ptr
QScopedArrayPointer:
指向数组的 std::unique_ptr
QPointer:
自释放指针,这个指针离开作用于不会触发资源释放动作,其 “智能” 体现在 “如果对其指向的资源执行了销毁,那么这个指针会自动置空” , 这很有用,比如多个QPointer指向同一个资源,那么对任何一个QPointer进行delete,都会让所有QPointer变为NULL,这个指针能有效规避野指针。
QSharedDataPointer 和 QSharedData :
完成指针的写实拷贝功能。
参考:https://blog.csdn.net/liyuanbhu/article/details/77825655
Qt 中隐式共享和写时拷贝就是利用 QSharedDataPointer 和 QSharedData 这两个类来实现的。
比如我们有个类叫做 Employee,里面有些数据希望能够利用隐式共享和写时拷贝技术。那么我们可以把需要隐式共享的数据封装到另一个类中,比如叫做 EmployeeData,这个类要继承自 QSharedData。
class EmployeeData : public QSharedData
{
public:
EmployeeData() : id(-1) { }
EmployeeData(const EmployeeData &other)
: QSharedData(other), id(other.id), name(other.name) { }
~EmployeeData() { }
int id;
QString name;
};
这个例子中,id 和 name 就是我们要隐式共享和写时拷贝的数据。那么 Employee 类需要这么来实现。
class Employee
{
public:
Employee() { d = new EmployeeData; }
Employee(const Employee &other)
: d (other.d)
{
}
Employee(int id, const QString &name)
{
d = new EmployeeData;
setId(id);
setName(name);
}
Employee(const Employee &other)
: d (other.d)
{
}
void setId(int id) { d->id = id; }
void setName(const QString &name) { d->name = name; }
int id() const { return d->id; }
QString name() const { return d->name; }
private:
QSharedDataPointer<EmployeeData> d;
};
我们对 Employee 中数据的访问都要通过 d。那么当需要修改 id 或 name 时,QSharedDataPointer 类自动的调用 detach() 方法来完成数据的拷贝。d (other.d) 则完成了隐式共享的功能。
QWeakPointer:
类比 std::weak_ptr