搬砖的哈哈 2024-02-20 14:56 采纳率: 20%
浏览 154

Qt报异常std::bad_alloc

用qt编了个程序,读取文件内容并排序后写入新的文件中。
做法是,一次性读取全部文件内容,用QStringList存起来,然后用sort排序,最后写入新文件。
现在测试一次能读取最大文件的大小,但是测试过程中出现了问题,第一次启动程序,读取一个715M大小的文件后成功排序并生成文件,OK通过,不关闭程序,再点击按钮排序重新执行上述操作,结果报std::bad_alloc异常,异常的地方在strlist.append这个地方。但是第一次明明没问题,内存是够的,第二次就出问题了。
把程序关闭,重新开启,第一次没问题,第二次又异常了。我把QStringList换成QVector还是不行。
请问这是什么现象呢?

  • 写回答

2条回答 默认 最新

  • GISer Liu 2024-02-20 15:04
    关注

    该回答引用自GPT-3.5,由博主GIS_Liu编写:

    这个问题看起来像是内存泄漏导致的内存耗尽。在第一次读取、排序、写入文件时,可能程序使用了大量内存,但在第二次尝试时,由于内存没有被正确释放,导致内存耗尽,触发了std::bad_alloc异常。

    解决这个问题的思路是确保在每次操作结束后正确释放内存。你可以尝试以下几点来解决这个问题:

    1. 分块读取文件: 不要一次性读取整个文件,而是分块读取,处理完一个块后再读取下一个块。这样可以减少内存占用。

    2. 分块排序: 不要一次性对整个文件内容排序,而是分块排序,处理完一个块后再处理下一个块。

    3. 定期释放内存: 在处理完每个块后,手动释放相关的内存。对于QStringList或QVector,可以使用clear()方法来释放内存。

    4. 检查是否有其他地方导致内存泄漏: 除了文件读取和排序的部分,还要检查程序中的其他部分是否存在内存泄漏的问题,例如其他数据结构的使用等。

    下面是一个可能的解决方案的代码框架:

    // 读取文件并排序的函数
    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的内存。你可以根据实际情况调整块的大小以及释放内存的频率。

    如果该回答解决了您的问题,请采纳!如果没有,请参考以下方案进行修订

    用户答题指南

    评论

报告相同问题?

问题事件

  • 创建了问题 2月20日