qlist 嵌套_QList内存释放

qlist 嵌套_QList内存释放QList 的释放分两种情况 1 T 的类型为非指针 这时候直接调用 clear 方法就可以释放了 看如下测试代码 include include includeintma intargc char argv QCoreApplica argc argv typedefstruc test intid QStringn

QList 的释放分两种情况:

1.T的类型为非指针,这时候直接调用clear()方法就可以释放了,看如下测试代码

#include#include#include

intmain(intargc, char*argv[]){ QCoreApplication a(argc, argv); typedef struct_test{ intid; QString name; QString sex; }Por_test; QList<Por_test> slist; for(inti=0;i<;i++) { Por_test s; s.id= 1; s.name= QString("hello World!"); s.sex= QString("男"); slist.append(s); } slist.clear(); returna.exec();}

将上面代码中的slist.clear();

注释掉,内存显示为如下(任务管理器里的截图)

qlist 嵌套_QList内存释放

如不去掉的话,内存显示如下图

qlist 嵌套_QList内存释放

2.T的类型为指针的情况,这时候直接调用clear()方法将不能释放,先看代码

#include#include#includeintmain(intargc, char*argv[]){ QCoreApplication a(argc, argv); typedef struct_test{ intid; QString name; QString sex; }Por_test; QList<Por_test *> slist; for(inti=0;i<;i++) { Por_test*s= newPor_test(); s->id= 1; s->name= QString(“hello World!”); s->sex= QString(“男?”); slist.append(s); }// qDeleteAll(slist);slist.clear(); returna.exec();}

上面代码运行后的内存情况如下图

qlist 嵌套_QList内存释放

说明当T的类型为指针时,调用clear()方法并不能释放其内存

此时void qDeleteAll ( const Container & c

)方法将派上用场了,将上面代码中的注释去掉以后,

再次运行程序,此时的内存情况如下图

qlist 嵌套_QList内存释放

通过对比靓图,可以看出,内存已经释放,我们再来看下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 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.

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

方法。

注意,无论是使用STL的list、vector容器,还是QList、QVector容器,用new

分配给object的内存必须用delete释放掉,不能依赖容器的deallocator机制与clear()函数等,尤其当容器中存放对象的指针或嵌套对象容器时,具体原理可参考C++ STL 源码剖析。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/208780.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 上午10:47
下一篇 2026年3月19日 上午10:47


相关推荐

  • 带动Mac mini销量狂飙的OpenClaw,值得入手吗?

    带动Mac mini销量狂飙的OpenClaw,值得入手吗?

    2026年3月13日
    3
  • idea2021.8激活码[免费获取]

    (idea2021.8激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~BI…

    2022年3月22日
    75
  • 数据库设计工具MySQLWorkBench[通俗易懂]

    数据库设计工具MySQLWorkBench[通俗易懂]  该工具为MySQL官方提供地址:http://dev.mysql.com/downloads/workbench/小伙伴们注意按自己的操作系统选择下载版本。·       注意事项:安装后将环境语言配置成简体中文,否则中文乱码工作步骤新建模型后,会进入此页面。 1./2.切换数据库表设计与ER图。3. 创建/管理ER图4. 创建/管理表结构1….

    2022年7月11日
    22
  • acwing1057. 股票买卖 IV(状态机模型)

    acwing1057. 股票买卖 IV(状态机模型)给定一个长度为 N 的数组,数组中的第 i 个数字表示一个给定股票在第 i 天的价格。设计一个算法来计算你所能获取的最大利润,你最多可以完成 k 笔交易。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。一次买入卖出合为一笔交易。输入格式第一行包含整数 N 和 k,表示数组的长度以及你可以完成的最大交易数量。第二行包含 N 个不超过 10000 的正整数,表示完整的数组。输出格式输出一个整数,表示最大利润。数据范围1≤N≤105,1≤k≤100输入样例1:3 22

    2022年8月9日
    6
  • 爸妈老了

    爸妈老了爸妈老了

    2022年4月23日
    44
  • java学习(分布式架构)

    java学习(分布式架构)声明 版权所有 欢迎转载 请勿用于商业用途 联系信箱 开头的话 架构多半和业务关联在一起 如果只是简单的图书管理系统 选课系统或者什么简单的财务系统 用不着分布式 只有大型公司 高并发的业务才需要分布式的帮助 当然 架构本身要和业务模型紧密配合才能发挥作用 很长一段时间 java 都是最流行的编程语言 我想 一方面

    2026年3月19日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号