news 2026/8/3 22:20:38

QFileInfoList-基础-问题盘点

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
QFileInfoList-基础-问题盘点

这里是目录标题

  • 提问
  • 代码
  • 内存分配的核心原因
  • entryInfoList()的执行逻辑:
  • 内存分配的细节
  • 内存管理的注意事项
  • 后果
  • 互动

提问

你是否为了解QFileInfoList而惊喜过?你是否还不曾对QFileInfoList苦恼过?
不管是与不是,我都将抛出疑问,你知道它的细节吗?你了解过,当一个文件夹过于庞大时,它所带来的威胁?一次简单的访问文件夹,或许没有什么问题,但如果短时间内反复访问一个正在增大的文件夹,你是否考虑过会出现什么情况?

代码

void test() { …… QFileInfoList file_list = dir.entryInfoList(QDir::Files | QDir::Hidden | QDir::Dirs | QDir::NoDotAndDotDot); …… }

我们需要警醒,QFileInfoList时会申请内存的!

内存分配的核心原因

QFileInfoList的底层实现:QFileInfoList是QList < QFileInfo > 的别名。QList在动态添加元素时,会根据元素数量自动管理内存:

  • 当首次添加元素时,QList会分配初始内存块(通常预分配一定容量)。
  • 当元素数量超过当前容量时,QList会触发内存重分配(通过realloc或类似机制),扩展存储空间。
    每个QFileInfo对象本身占用固定内存(约几十字节,包含文件路径、大小、权限等元数据),这些对象在QList中以连续或非连续方式存储(取决于Qt版本和优化策略)。

entryInfoList()的执行逻辑:

该方法会遍历目录中的所有条目(包括文件、隐藏文件、子目录,但排除.和…)。对每个符合过滤条件的条目,创建一个QFileInfo对象,并将其添加到返回的QList中。即使目录为空,也会返回一个空列表(此时内存分配主要用于QList的元数据,如容量、大小等)。

内存分配的细节

  • 固定开销:
    QList的内存管理需要存储元素数量、容量指针、数据指针等元数据(通常占用几十字节)。
  • 动态开销:
    每个QFileInfo对象占用约48-64字节(取决于QString的存储优化,如路径字符串可能共享或按需分配)。若目录包含N个条目,则QList至少需要分配N * sizeof(QFileInfo) + 固定开销的内存。若QList容量不足,会按指数增长(如1.5倍或2倍)重新分配内存,导致临时内存占用增加(但最终会释放旧内存)。
  • 隐藏文件与目录的处理:QDir::Hidden和QDir::Dirs标志会额外包含隐藏文件和子目录,增加返回的条目数量,从而增加内存分配量。QDir::NoDotAndDotDot排除了.(当前目录)和…(上级目录),减少两个条目,但影响较小。

内存管理的注意事项

  • 自动释放:当file_list超出作用域时(如离开代码块),QList的析构函数会自动释放所有QFileInfo对象和内部内存。
  • 隐式共享(Copy-on-Write):若将file_list传递给其他函数或存储在类成员中,Qt的隐式共享机制会延迟实际内存复制,直到数据被修改。
  • 性能优化:对于大目录,可通过QDir::entryList()结合QFileInfo按需获取信息,避免一次性加载所有条目到内存。
  • 验证方法
    内存分析工具:使用Valgrind、ASan(AddressSanitizer)或Qt Creator的内存分析工具,观察调用entryInfoList()前后内存的变化。
  • 代码测试:在循环中调用该代码,监控进程内存占用(如Windows任务管理器、Linux的top命令),可观察到内存分配趋势。
    结论

这行代码会申请内存,主要用于存储QFileInfo对象列表和QList的元数据。内存分配量与目录中的条目数量(文件、隐藏文件、子目录)成正比,且受QList的内存管理策略影响。在Qt中,这种内存分配是必要的,但需注意大目录可能导致的内存开销,可通过分批处理或按需加载优化性能。

后果

如果对其并不在意,那么代表你还没有到接触这一层次的项目。与QFileInfo类似的,比比皆是,如果不对其加以管制,将会导致整个系统资源竞争激烈,最终卡顿,或者崩溃。在任何一个对内存有严格要求的项目中,规避QFileInfo等类似的内存异常申请,才是项目扩展的良好基础。

互动

QFileInfoList-避免另类的内存泄漏

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/2 4:12:12

LaTeX3编程革命:从传统宏包到现代结构化开发

LaTeX3编程革命&#xff1a;从传统宏包到现代结构化开发 【免费下载链接】latex3 The expl3 (LaTeX3) Development Repository 项目地址: https://gitcode.com/gh_mirrors/la/latex3 LaTeX3项目正在彻底改变我们编写LaTeX宏包的方式。作为LaTeXe的下一代编程模型&#x…

作者头像 李华
网站建设 2026/8/3 4:19:27

Material Kit轮播图快速上手:5步打造专业级动态展示效果

Material Kit轮播图快速上手&#xff1a;5步打造专业级动态展示效果 【免费下载链接】material-kit Free and Open Source UI Kit for Bootstrap 5, React, Vue.js, React Native and Sketch based on Googles Material Design 项目地址: https://gitcode.com/gh_mirrors/ma…

作者头像 李华
网站建设 2026/8/1 13:30:59

COMSOL模拟周期性结构的多极子展开与透射谱计算可视化分析

comsol周期性结构多极子展开 包含透射谱计算&#xff0c;多极子分解&#xff08;可导出数据用其他软件绘制也可comsol直接出图&#xff09;在光子晶体和超表面设计里&#xff0c;周期性结构的多极子分析简直像开透视挂——直接看到电磁场怎么在结构里蹦迪。COMSOL里搞这个其实不…

作者头像 李华
网站建设 2026/8/2 4:51:22

永磁同步电机自抗扰控制模型ADRC

永磁同步电机自抗扰控制模型ADRC永磁同步电机&#xff08;PMSM&#xff09;控制最头疼的就是各种扰动——负载突变、参数漂移、模型非线性&#xff0c;这时候自抗扰控制&#xff08;ADRC&#xff09;就派上用场了。这玩意儿不跟你死磕精确数学模型&#xff0c;反而直接暴力拆解…

作者头像 李华
网站建设 2026/8/3 19:46:30

AI驱动招聘价值重构:从人才入口到组织效能的全链路升级

AI驱动招聘价值重构&#xff1a;从人才入口到组织效能的全链路升级AI得贤招聘官当企业纷纷加码HR数字化转型&#xff0c;核心HR系统、工时薪资核算模块已逐步实现线上化&#xff0c;但作为人才供应链起点的招聘环节&#xff0c;却常陷入“高投入低产出”的困境&#xff1a;海量…

作者头像 李华
网站建设 2026/8/2 12:31:43

Node.js ESC/POS打印实战:企业级解决方案深度解析

Node.js ESC/POS打印实战&#xff1a;企业级解决方案深度解析 【免费下载链接】node-escpos &#x1f5a8;️ ESC/POS Printer driver for Node.js 项目地址: https://gitcode.com/gh_mirrors/no/node-escpos 在数字化转型浪潮中&#xff0c;企业面临着如何高效整合硬件…

作者头像 李华