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