Qt 智能指针

时间:2024-10-06 18:16:36

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;
};