[转]QList内存释放
QList<T> 的释放分两种情况:
1.T的类型为非指针,这时候直接调用clear()方法就可以释放了,看如下测试代码
#include <QtCore/QCoreApplication>
#include <QList>
#include <QString>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv); typedef struct _test
{
int id;
QString name;
QString sex;
}Por_test; QList<Por_test> slist;
for (int i=;i<;i++)
{
Por_test s;
s.id = ;
s.name = QString("hello World!");
s.sex = QString("男");
slist.append(s);
}
slist.clear();
return a.exec();
}
将上面代码中的slist.clear(); 注释掉,内存显示为如下(任务管理器里的截图)
![]()
如不去掉的话,内存显示如下图
![]()
2.T的类型为指针的情况,这时候直接调用clear()方法将不能释放,先看代码
#include <QtCore/QCoreApplication>
#include <QList>
#include <QString>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv); typedef struct _test
{
int id;
QString name;
QString sex;
}Por_test; QList<Por_test *> slist;
for (int i=;i<;i++)
{
Por_test *s = new Por_test();
s->id = ;
s->name = QString("hello World!");
s->sex = QString("男?");
slist.append(s);
}
// qDeleteAll(slist);
slist.clear();
return a.exec();
}
上面代码运行后的内存情况如下图
![]()
说明当T的类型为指针时,调用clear()方法并不能释放其内存
此时void qDeleteAll ( const Container & c )方法将派上用场了,将上面代码中的注释去掉以后,
再次运行程序,此时的内存情况如下图
![]()
通过对比靓图,可以看出,内存已经释放,我们再来看下qt助手中qDeleteAll 方法的说明
void qDeleteAll ( ForwardIterator begin, ForwardIterator end )
Deletes all the items in the range [begin, end) using the C++ delete operator. The item type must be a pointer type (for example, QWidget *).
Example:
QList<Employee *> list;
list.append(new Employee("Blackpool", "Stephen"));
list.append(new Employee("Twist", "Oliver")); qDeleteAll(list.begin(), list.end());
list.clear();
Notice that qDeleteAll() doesn't remove the items from the container; it merely calls delete on them. In the example above, we call clear() on the container to remove the items.
This function can also be used to delete items stored in associative containers, such as QMap and QHash. Only the objects stored in each container will be deleted by this function; objects used as keys will not be deleted.
See also forward iterators.
void qDeleteAll ( const Container & c )
This is an overloaded member function, provided for convenience.
This is the same as qDeleteAll(c.begin(), c.end()).
上面qDeleteAll 方法的说明,已经很清楚了,如果T为指针类型时,释放内存须在clear方法前加上qDeleteAll 方法。
[转]QList内存释放的更多相关文章
- QList内存释放(看它内部存储的是否是Object,另外还有qDeleteAll)
QList<T> 的释放分两种情况: 1.T的类型为非指针,这时候直接调用clear()方法就可以释放了,看如下测试代码 #include <QtCore/QCoreApplicat ...
- 关于vector的内存释放问题
以前一直想当然的以为vector 的clear()函数会保证释放vector的内存,今天网上一查资料发现完全不是我想象的那样子. 比如有如下代码: tempObject obj1; tempObjec ...
- STL 内存释放
C++ STL 中的map,vector等内存释放问题是一个很令开发者头痛的问题,关于 stl内部的内存是自己内部实现的allocator,关于其内部的内存管理本文不做介绍,只是 介绍一下STL内存释 ...
- java 笔记(1)-—— JVM基础,内存数据,内存释放,垃圾回收,即时编译技术JIT,高精度类型
1.java中5个存放数据的地方: (1).寄存器(Registers):位于CPU内部,是速度最快的存储区,但是数量和容量有限.在java中不能直接操作寄存器. (2).栈(Stack):栈位于通用 ...
- zw版【转发·台湾nvp系列Delphi例程】.NET调用HALCON COM控件内存释放模式
zw版[转发·台湾nvp系列Delphi例程].NET调用HALCON COM控件内存释放模式 ------------------------------------方法一 :Imports Sys ...
- WebBrowser的内存释放
WebBrowser窗口自动滚动: this.webBrowser.Document.Window.ScrollTo(0, webBrowser1.Document.Body.ScrollRectan ...
- [super dealloc]内存释放的先后顺序
心得:从前做内存释放,只是觉得应该,没体会到这个的重要性,如果不及时释放就会有很多内存泄露,就像我早期遇到的前赴后继的崩溃,比如:没使用完,就释放会崩溃等明显的release问题. 作为全局的 ...
- MKMapView的内存释放问题
MKMapView的内存释放问题 by 伍雪颖 - (void)dealloc { self.mapView.showsUserLocation = NO; self.mapView.userTrac ...
- Unity3D内存释放
Unity3D内存释放 最近网友通过网站搜索Unity3D在手机及其他平台下占用内存太大. 这里写下关于Unity3D对于内存的管理与优化. Unity3D 里有两种动态加载机制:一个是Resourc ...
随机推荐
- ajax极简教程
一.什么是ajax ajax即异步JavaScript和XML,它是一种用于创建快速动态网页的技术.作用是通过在后台与服务器进行少量数据交换,使网页实现异步更新.这意味着可以在不重新加载整个网页的情况 ...
- Homework 1_SQL Server中由于外键约束而删除数据失败
SQL Server中由于外键约束而删除数据失败 原因分析:外键约束问题.在配置文件中配置了一对一的关系,外键也是唯一的.数据库中数据有严格的依赖关系. 而在业务逻辑中,在往数据库里删除数据之前,却忘 ...
- Spring Cloud与微服务构建:Spring Cloud简介
Spring Cloud简介 微服务因该具备的功能 微服务可以拆分为"微"和"服务"二字."微"即小的意思,那到底多小才算"微&q ...
- Codeforces Round#509 Div.2翻车记
A:签到 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> # ...
- spring接收json字符串的两种方式
一.前言 前几天遇到一个问题,前端H5调用我的springboot一个接口(post方式,@RequestParameter接收参数),传入的参数接收不到.自己测试接口时使用postman的form- ...
- [SDOI2013]项链
description luogu 最近,铭铭迷恋上了一种项链.与其他珍珠项链基本上相同,不过这种项链的珠子却与众不同,是正三菱柱的泰山石雕刻而成的. 三菱柱的侧面是正方形构成的,上面刻有数字. 能够 ...
- view的阴影效果shadowColor
btn.layer.shadowColor = UIColor.blackColor().CGColor btn.layer.shadowOffset = CGSizeMake(5, 5) btn.l ...
- java中poi进行execl导出
首先贴出最终导出的execl截图吧: 前台界面如下: 点击导出时,为其按钮的onclick事件添加exportDate()函数: function exportDate(){ var begin_Da ...
- linux内核分析 第八周 理解进程调度时机跟踪分析进程调度与进程切换的过程
笔记: 实验:使用gdb跟踪分析一个schedule()函数
- 为smokeping添加日志开启debug
用包管理工具安装smokeping没有自带日志输出,为了定位问题开启日志就成为第一需求. 1.修改smokeping的配置 # vim /etc/smokeping/config.d/General ...