0
点赞
收藏
分享

微信扫一扫

[Qt] Qt 中的智能指针


类别:

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 :

完成指针的写实拷贝功能。

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

举报

相关推荐

0 条评论