| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> QPointer、QScopedPointer、QSharedDataPointer等指针用法总结 -> 正文阅读 |
|
[C++知识库]QPointer、QScopedPointer、QSharedDataPointer等指针用法总结 |
1 . QPointer这是一个模板类,是一个警卫、看守指针。QPointer<T>的行为非常类似C++的普通指针T*。和C++的普通指针T*有一点不同的是:当指针指向的对象被销毁时,该指针自动会被清除,即置为nullptr,而C++的普通指针指向的对象被销毁,如果不人工置为nullptr,则不会被自动清除,一般会成为悬垂指针,即野指针。QPointer<T>中的T类型必须是QObject的子类。 当你需要保存一个指向QObject的子类对象(为了便于后文描述,称该对象为A)但该对象被其它对象(为了便于后文描述,称该对象为B)占用时,警卫、看守指针在这种情况下就非常有用。当B删除销毁了A时,使用QPointer<T>可以测试其指向的对象是否有效。如下代码:
当代码执行到第3行时,第1行new出来的QLabel对象在其它地方被delete了,则label就会自动被置为nullptr,从而导致第4、5行代码不会被执行。如果是C++普通指针,则不会被置为nullptr,代码执行到第4行时会崩溃。 一些在C++普通指针上执行的函数和操作符对 QPointer同样适用,没啥区别。但指针算术操作符是个例外,对 QPointer来说,指针算术操作符+、-、++、--仅仅用在 QObject子类类型的数组上。 你可以从一个T*类型的指针或另外一个同类型的QPointer<T>构造或赋值出一个新的警卫、看守指针QPointer<T>。 你可以通过operator==() 、 operator!=()比较两个警卫、看守指针QPointer<T>是否指向相同的对象或不同的对象;你也可以通过*x?或x->解引用指向的对象。你可以通过isNull()判断指向的对象是否为空。 警卫、看守指针QPointer<T>能自动转换到T*的C++普通指针,所以你可以放心地混合使用T*类型的C++普通指针和QPointer<T>。这意味着下面的代码是可行的:
而不必要特意将fun函数的参数定义为QPointer<QLabel>,即下述代码是没多大价值的:
当你需要长时间保存某个QObject子类的对象时,用QPointer指针。 注意:QPointer封装的指针的类型必须是QObject子类,否则编译器、连接器会报错。 2.QWeakPointer、QSharedPointer? ? 这两个指针和STL的std::shared_ptr 、std::weak_ptr作用相同,参见《C++ STL 四种智能指针》文章描述。 3?QScopedPointer??QScopedPointer保证了指向的对象超过其作用域后被自动删除析构,如下代码:
上面的函数有很多退出点,为了删除new出的对象,每个退出点都加入了delete,这使得程序臃肿不堪,可读性、可维护性大大降低。用QScopedPointer改写上述代码后,简化了很多,如下:
待用const限定符的对象也可以被QScopedPointer表示,如下:
用malloc分配的数组对象不能用delete删除,QScopedPointer模板的第二个参数被用来定义一个删除器。下列这些自定义的删除已经存在了:
你可以提供自定义删除器,自定义删除器必须满足:
如下为自定义的删除器:
4.QSharedDataPointer、QExplicitlySharedDataPointer 这两个参见Qt Assistant ,里面讲的很详细,这里不再讲解。 |
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 22:12:20- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |