QSharedPointer
带管家(引用计数)的智能指针
// 创建一个对象,计数=1
QSharedPointer<MyClass> p1 = new MyClass;
// 拷贝!计数变成 2
QSharedPointer<MyClass> p2 = p1;
// 拷贝!计数变成 3
QSharedPointer<MyClass> p3 = p2;
1. 创建方式
// 方式1
QSharedPointer<MyClass> ptr(new MyClass);
// 方式2(Qt5.14+ 推荐,更安全)
auto ptr = QSharedPointer<MyClass>::create();
2. 拷贝 / 赋值
auto ptr2 = ptr; // 计数+1
3. 主动释放
ptr.reset(); // 计数-1
4. 判断是否为空
if(ptr.isNull()) { }
if(ptr) { }
5. 获取原始指针
MyClass* raw = ptr.data();
QEnableSharedFromThis
使类能够安全地从成员函数内部获得指向自身的 shared_ptr。
#include <QApplication>
#include <QEnableSharedFromThis>
#include <QDebug>
class MyClass:public QEnableSharedFromThis<MyClass>{
public:
QSharedPointer<MyClass> getShared(){
return sharedFromThis();
}
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
// std::shared_ptr<MyClass> obj1 = std::make_shared<MyClass>();
// qDebug()<<obj1.use_count();
// QSharedPointer<MyClass> ptr11(MyClass());
QSharedPointer<MyClass> ptr1 = QSharedPointer<MyClass>::create();
QSharedPointer<MyClass> ptr2 = ptr1->getShared();
qDebug()<<ptr1.data();
qDebug()<<ptr2.data();
return a.exec();
}
QSharedPointer 没有提供获取引用计数的函数,std::shared_ptr 有 use_count()。
QScopedPointer
类似于标准库中的 std::unique_ptr,负责对象的自动释放,以防止内存泄漏。
QScopedPointer = 自动管理内存的指针 作用:new 创建的对象,不用手动 delete,离开作用域自动释放 特点:不能拷贝、不能转移所有权,谁创建谁负责到底
QScopedPointer<MyClass> p(new MyClass);
// 离开大括号 {} 自动 delete
// 你永远不用写 delete!
QScopedPointer<MyClass> sp(new MyClass);
sp.get(); // 获取原始指针(MyClass*)
sp->method(); // 调用方法
sp.data(); // 和 get() 一样
sp.reset(); // 手动删除对象
sp.reset(new MyClass); // 删除旧对象,托管新对象
sp.take(); // 取消托管,返回原始指针(不再自动删除)