qDeleteAll 之后必须清空容器
【1】qDeleteAll应用示例
qDeleteAll源码如下:
template <typename ForwardIterator>
Q_OUTOFLINE_TEMPLATE void qDeleteAll(ForwardIterator begin, ForwardIterator end)
{
while (begin != end)
{
delete *begin;
++begin;
}
} template <typename Container>
inline void qDeleteAll(const Container &c)
{
qDeleteAll(c.begin(), c.end());
}
示例代码如下:
#include <QMap>
#include <QString>
#include <QWidget>
#include <QDebug>
#include <QApplication> class PersonInfo
{
public:
PersonInfo(int id = -, QString name = QString(), QWidget* pWidget = NULL)
: m_nId(id)
, m_name(name)
, m_pWidget(pWidget)
{} ~PersonInfo()
{
m_nId = -;
m_name = QString();
if (m_pWidget != NULL)
{
qDebug() << "delete personInfo :: " << this;
delete m_pWidget;
m_pWidget = NULL;
}
}
private:
int m_nId;
QString m_name;
QWidget* m_pWidget;
}; int main(int argc, char *argv[])
{
QApplication a(argc, argv); QMap<int, PersonInfo *> map;
for (int i = ; i < ; ++i)
{
PersonInfo *pTemp = new PersonInfo(i + , QString("hello World!"), (new QWidget()));
qDebug() << "construct personInf :: " << pTemp;
map.insert(i, pTemp);
} qDeleteAll(map); // 1.释放内存
qDebug() << "after qDeleteAll size :: " << map.size() << endl;
map.clear(); // 2.必须清空
qDeleteAll(map); // 3.再次释放内存 return a.exec();
}
打印结果如下:
construct personInf :: 0x3bdc20
construct personInf :: 0x3c0308
construct personInf :: 0x3bfe08
construct personInf :: 0x3c0a88
construct personInf :: 0x3c1248
construct personInf :: 0x3c1738
construct personInf :: 0x3c1bb8
construct personInf :: 0x3c2420
construct personInf :: 0x3c26d0
construct personInf :: 0x3c2c68
delete personInfo :: 0x3bdc20
delete personInfo :: 0x3c0308
delete personInfo :: 0x3bfe08
delete personInfo :: 0x3c0a88
delete personInfo :: 0x3c1248
delete personInfo :: 0x3c1738
delete personInfo :: 0x3c1bb8
delete personInfo :: 0x3c2420
delete personInfo :: 0x3c26d0
delete personInfo :: 0x3c2c68
after qDeleteAll size ::
尤其注意打印结果。
可以尝试把2.清空容器行注释掉,然后再运行程序,查看运行结果。
【2】总结
qDeleteAll只负责释放容器元素内存,但没有对容器的置空操作。若无意间二次再执行qDeleteAll过程,程序必会崩溃。
为了避免可恶的崩溃,切记qDeleteAll之后必须清空容器。
Good Good Study, Day Day Up.
顺序 选择 循环 总结
qDeleteAll 之后必须清空容器的更多相关文章
- 用AS3清空容器下所有子显示对象
容器中的子显示对象分为两类: 处于显示列表中的子显示对象.被numChildren所记录的. 由容器graphics对象绘制出来的矢量图.这个矢量图不属于Shape类型,不在容器的显示列表中,不被nu ...
- QT 随笔目录
[1]基础部分 <信号和槽机制> <信号与槽知识点> <QString 与 string转换> <QT 继承QWidget && 继承QDia ...
- Qt中的通用模板算法QtAlgorithms(qDeleteAll,qBinaryFind,qCountLeadingZeroBits,qPopulationCount,qFill,qSwap,qSort)
Qt在<QtAlgorithms>头文件中为我们提供了一系列的全局模板方法,这些模板方法主要用于容器操作,比如qDeleteAll().其在Qt中的声明如下: void qDeleteAl ...
- Spring容器深入(li)
spring中最常用的控制反转和面向切面编程. 一.IOC IoC(Inversion of Control,控制倒转).对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的 ...
- C++ STL vector容器学习
STL(Standard Template Library)标准模板库是C++最重要的组成部分,它提供了一组表示容器.迭代器.函数对象和算法的模板.其中容器是存储类型相同的数据的结构(如vector, ...
- HDU 4857 逃生 (反向拓扑排序 & 容器实现)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4857 逃生 Time Limit: 2000/1000 MS (Java/Others) Mem ...
- JAVA容器
JAVA容器 一.容器体系结构 java.util 二.迭代器Iterator<E> 迭代器是一种设计模式,可以遍历并选择序列中的对象,而开发人员并不需要了解该序列的底层结构.迭代器通常被 ...
- STL标准模板库 向量容器(vector)
向量容器使用动态数组存储.管理对象.因为数组是一个随机访问数据结构,所以可以随机访问向量中的元素.在数组中间或是开始处插入一个元素是费时的,特别是在数组非常大的时候更是如此.然而在数组末端插入元素却很 ...
- [翻译] C++ STL容器参考手册(第二章 <deque>)
返回总册 本章节原文:http://www.cplusplus.com/reference/deque/deque/ 1. std::deque template < class T, clas ...
随机推荐
- 【PyQt5-Qt Designer】按钮系列
[PyQt5-Qt Designer]按钮系列 复选框(QCheckBox) 效果如下: 参考: https://zhuanlan.zhihu.com/p/30509947 完整代码: from Py ...
- 谈谈javascript数组排序方法sort()的使用,重点介绍参数使用及内部机制?
语法:arrayObject.sort(sortby) 参数sortby可选,规定排序顺序,必须是函数: 注:如果调用该方法时没有使用参数,将按字符编码的顺序进行排序,要实现这一点,首先应把数组的元素 ...
- gitlab:开发+测试+发布的全流程图
- (4.4)mysql备份还原——备份存储容灾基础知识
存储知识 1.为什么需要存储,存储一般解决哪些问题? 容量.速度.易于管理.安全(容灾与备份).可扩展性 2.存储发展历史 [2.1]大型机 [2.2]c/s结构(客户端->服务器) [2.3] ...
- 用PE系统安装原版XP
方法:直接运行Winnt32程序进行XP原版系统安装. [1].在PE系统中将XP SP3系统镜像ISO文件从U盘上复制到硬盘的非系统分区后,用PE所带WinRAR程序将该ISO镜像中的I386 ...
- 列表 list 容器类型数据(str字符串, list列表, tuple元组, set集合, dict字典)--->元组 tuple-->字符串 str
# ### 列表 list 容器类型数据(str字符串, list列表, tuple元组, set集合, dict字典) # (1)定义一个列表 listvar = [] print(listvar, ...
- [py]py3/pip/virtualenv/mysql环境安装
Traceback (most recent call last):是什么意思? 追踪(最后调用) pip.ini添加 https://www.cnblogs.com/lsdb/p/9188204.h ...
- 浅谈Python web框架
一.Python web框架 Web Framework,Ruby的世界Rails一统江湖,而Python则是一个百花齐放的世界,各种micro-framework.framework不可胜数,不完全 ...
- lua加载函数require和dofile
lua加载函数require和dofile Lua提供高级的require函数来加载运行库.粗略的说require和dofile完成同样的功能但有两点不同: 1. require会搜索目录加载文件; ...
- vi相关
vi有三种模式: 命令模式:键盘的任意输入都当成“编辑命令”: 输入模式:键盘的任意输入都当成文本内容: 末行模式:键盘的任意输入都当成“文本管理命令” 命令模式(刚打开)==>(i,a,o)输 ...