news 2026/4/23 10:06:40

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/4/23 12:14:34

MiniGPT-4效率优化实战:3倍性能提升的系统架构重构

MiniGPT-4效率优化实战&#xff1a;3倍性能提升的系统架构重构 【免费下载链接】MiniGPT-4 Open-sourced codes for MiniGPT-4 and MiniGPT-v2 (https://minigpt-4.github.io, https://minigpt-v2.github.io/) 项目地址: https://gitcode.com/gh_mirrors/mi/MiniGPT-4 面…

作者头像 李华
网站建设 2026/4/23 12:22:30

WebRL-Llama-3.1-8B终极指南:如何用AI智能助手实现网页操作自动化

WebRL-Llama-3.1-8B终极指南&#xff1a;如何用AI智能助手实现网页操作自动化 【免费下载链接】webrl-llama-3.1-8b 项目地址: https://ai.gitcode.com/zai-org/webrl-llama-3.1-8b 在现代数字化工作环境中&#xff0c;网页操作自动化已经成为提升效率的关键技术。WebR…

作者头像 李华
网站建设 2026/4/23 11:20:11

【python大数据毕设实战】王者荣耀账号交易信息可视化分析系统、Hadoop、计算机毕业设计、包括数据爬取、数据分析、数据可视化、机器学习、实战教学

&#x1f34a;作者&#xff1a;计算机毕设匠心工作室 &#x1f34a;简介&#xff1a;毕业后就一直专业从事计算机软件程序开发&#xff0c;至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长&#xff1a;按照需求定制化开发项目…

作者头像 李华