用qt编了个程序,读取文件内容并排序后写入新的文件中。
做法是,一次性读取全部文件内容,用QStringList存起来,然后用sort排序,最后写入新文件。
现在测试一次能读取最大文件的大小,但是测试过程中出现了问题,第一次启动程序,读取一个715M大小的文件后成功排序并生成文件,OK通过,不关闭程序,再点击按钮排序重新执行上述操作,结果报std::bad_alloc异常,异常的地方在strlist.append这个地方。但是第一次明明没问题,内存是够的,第二次就出问题了。
把程序关闭,重新开启,第一次没问题,第二次又异常了。我把QStringList换成QVector还是不行。
请问这是什么现象呢?
Qt报异常std::bad_alloc
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
2条回答 默认 最新
GISer Liu 2024-02-20 15:04关注该回答引用自GPT-3.5,由博主GIS_Liu编写:
这个问题看起来像是内存泄漏导致的内存耗尽。在第一次读取、排序、写入文件时,可能程序使用了大量内存,但在第二次尝试时,由于内存没有被正确释放,导致内存耗尽,触发了
std::bad_alloc异常。解决这个问题的思路是确保在每次操作结束后正确释放内存。你可以尝试以下几点来解决这个问题:
分块读取文件: 不要一次性读取整个文件,而是分块读取,处理完一个块后再读取下一个块。这样可以减少内存占用。
分块排序: 不要一次性对整个文件内容排序,而是分块排序,处理完一个块后再处理下一个块。
定期释放内存: 在处理完每个块后,手动释放相关的内存。对于QStringList或QVector,可以使用clear()方法来释放内存。
检查是否有其他地方导致内存泄漏: 除了文件读取和排序的部分,还要检查程序中的其他部分是否存在内存泄漏的问题,例如其他数据结构的使用等。
下面是一个可能的解决方案的代码框架:
// 读取文件并排序的函数 void processFile(const QString &filePath) { QFile file(filePath); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { qDebug() << "Failed to open file:" << file.errorString(); return; } const qint64 blockSize = 1024 * 1024; // 1 MB while (!file.atEnd()) { QByteArray block = file.read(blockSize); QString content = QString::fromUtf8(block); QStringList strList = content.split("\n"); strList.sort(); // 写入新文件等操作 // ... // 定期释放内存 strList.clear(); } file.close(); }在这个例子中,我们每次读取一个固定大小的块,并在处理完一个块后手动释放
strList的内存。你可以根据实际情况调整块的大小以及释放内存的频率。如果该回答解决了您的问题,请采纳!如果没有,请参考以下方案进行修订
解决 无用评论 打赏 举报