Qt 中智能指针包括:
- QSharedPointer ----> std::shared_ptr 引用计数
多个线程同时修改 QSharedPointer 指向的数据时还要应该考虑 加锁
- QScopedPointer ----> std::uniq_ptr 独占
- QScopedArrayPointer
- QWeakPointer ----> std::weak_ptr 弱引用计数
- QPointer
用于指向 QObject 及派生类的对象。当一个 QObject 或派生类对象被删除后,QPointer 能自动把其内部的指针设为 0
当QPointer 对象超出作用域时,并不会删除它指向的内存对象。这和其他的智能指针是不同的
- QSharedDataPointer ----> 实现数据的隐式共享(写时复制 copy-on-write))
- QExplicitlySharedDataPointer -->同上,但是它禁用了写时复制功能
class EmployeeData : public QSharedData {
public:EmployeeData() : id(-1) { }EmployeeData(const EmployeeData &other): QSharedData(other), id(other.id), name(other.name) {}//要隐式共享和写时拷贝的数据int id;QString name;
};
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; }int id() const { return d->id; }void setName(const QString &name) { d->name = name; }QString name() const { return d->name; }private:// 把需要隐式共享的数据(id,name)封装到另一个类中QSharedDataPointer<EmployeeData> d;
};