• 641阅读
  • 6回复

[讨论]Qt 遍历整个磁盘文件时,中途突然报错Debug Assertion Failed!后程序退出 [复制链接]

上一主题 下一主题
离线lwei24
 

只看楼主 倒序阅读 楼主  发表于: 2023-09-26
如题,调用如下代码去遍历C盘下所有的文件,Worker是继承QObject,作为工作线程。在Qt应用程序调用到该线程时,去遍历C盘下所有的文件,中途突然报错:Debug Assertion Failed!
  1. void Worker::browseFiles(QString path, std::vector<QString> &files)
  2. {
  3.     bool res = true;
  4.     _finddata_t file;
  5.     QString aFilePath = path + "\\*.*";
  6.     QByteArray aByteArray = aFilePath.toLocal8Bit();
  7.     char const* filePath = aByteArray.data();
  8.     /*intptr_t*/long long handle = _findfirst(filePath, &file);
  9.     if (handle == -1L)
  10.     {
  11.         qDebug()<<QString("_findfirst handle error:-1 %1").arg(QString::number(__LINE__));
  12.     }
  13.     else
  14.     {
  15.         do
  16.         {
  17.             if (file.attrib & _A_SUBDIR)
  18.             {
  19.                 if ((strcmp(file.name, ".") != 0) && (strcmp(file.name, "..") != 0))
  20.                 {
  21.                     QString newPath = QDir::toNativeSeparators(path) +"\\" + QString::fromLocal8Bit(file.name);
  22.                     browseFiles(newPath, files);
  23.                 }
  24.             }
  25.             else
  26.             {
  27.                 QString newPath = QDir::toNativeSeparators(path) + "\\" + QString::fromLocal8Bit(file.name);
  28.                 files.push_back(newPath);
  29.             }
  30.             if(handle == -1)
  31.             {
  32.                 qDebug()<<QString("_findnext handle error:-1 %1").arg(QString::number(__LINE__));
  33.                 res = false;
  34.                 break;
  35.             }
  36.             if(m_interrupt)
  37.             {
  38.                 qDebug()<<QString("browse file interrupt error"));
  39.                 res = false;
  40.                 break;
  41.             }
  42.         } while (_findnext(handle, &file) == 0);
  43.         _findclose(handle);
  44.     }
  45. }
具体报错如下:
Debug Assertion Failed!
Program: ...xxx\Qt\xxx.exe
File: minkernel\crts\ucrt\src\appcrt\lowio\isatty.cpp
Line: 17
Expression: (fh >= 0 && (unsigned)fh < (unsigned)_nhandle)
For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.
(Press Retry to debug the application)
各位大佬们,麻烦大家帮忙看看,以上代码为什么会报错呢?而且,因为是递归遍历整个磁盘,发现Qt应用程序的内存一直在变大,但使用的vector已经在调用前做了初始化,还有什么办法可以让它在遍历整个磁盘的过程中内存一直增加吗?网上很多都说是文件句柄的问题,即使将它改成long long类型,依然还是会报错Debug Assertion Failed!如上错误。欢迎各位大佬们指点一二,小弟在线等,感激不尽!!!


离线20091001753

只看该作者 1楼 发表于: 2023-09-26
遍历C盘文件,就算你代码写对了,运行也未必能顺利,有权限问题。
(づ ̄ 3 ̄)づ
离线liudianwu

只看该作者 2楼 发表于: 2023-09-27
也可能是内存泄漏了
欢迎关注微信公众号:Qt实战/Qt入门和进阶(各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发) QQ:517216493  WX:feiyangqingyun  QQ群:751439350
离线lwei24

只看该作者 3楼 发表于: 2023-09-27
回 20091001753 的帖子
20091001753:遍历C盘文件,就算你代码写对了,运行也未必能顺利,有权限问题。 (2023-09-26 16:39) 

多谢提醒,不过Qt应用程序一开始就是以管理员权限运行,即使不遍历C盘,遍历D盘,它也会中途Debug Assertion Failed!!
离线lwei24

只看该作者 4楼 发表于: 2023-09-27
回 liudianwu 的帖子
liudianwu:也可能是内存泄漏了 (2023-09-27 09:13) 

多谢您的建议,目前我也觉得是内存泄露,因为递归一直在遍历获取磁盘文件的路径,内存从任务管理器后台的进程看,内存一直在增加,因此,我在std::vector使用前做了初始化。但好像也没有什么作用。现在还在找为什么会遍历到一半就出现Debug Assertion Failed……
离线spygg

只看该作者 5楼 发表于: 2023-09-28
这个肯定是 files.push_back(newPath);这句文件太多导致内存溢出了,此外Qt有自带的遍历文件API
签名就是这么浪
离线lwei24

只看该作者 6楼 发表于: 2023-10-07
回 spygg 的帖子
spygg:这个肯定是 files.push_back(newPath);这句文件太多导致内存溢出了,此外Qt有自带的遍历文件API (2023-09-28 09:39) 

哦哦,起初我也是想用Qt自带的遍历文件API,但好像遍历的结果不是很准确,才转用c/c++的。
快速回复
限100 字节
 
上一个 下一个