univers1314 2024-10-04 22:15 采纳率: 33.3%
浏览 153

爆内存的问题。抛出 bad allocation

大师们好,我写了一个小程序,存在爆内存的问题。抛出 bad allocation
程序是这样的,一个记事本文件有几十MB,也就是日志文件,我用while (getline(file, line))这个函数一行一行读取。那在下面就有几个查找,判断的C++函数。如果找到相关有用的,就把她写入到一个日志里,并记录下来。差不多5分钟要重新读一个文件。
那问题了来,在第一次while (getline(file, line))读完后,显示内存为120MB .下一次就在这里递增,200MB 累加,不停的加。320MB。之后程序报错。
我在网上查了好久,怎么清理内存。到现在也没有找到解决方法。我要怎样改?
**
2024.10.07
解决了,是string buf_A[4098]; 这个定量的表是释放不了内存的,导致一直爆增内存,这样写是不正确的。
改好之后是这样,表用向量 vector buf_A; // 使用 vector 来存储数据
临时释放内存用buf_A.clear(); //清空数组释放内存
当程序跑到尾部了,用vector().swap(buf_A); //释放全部占用内存
这样就能正常运行了,跑几天也不会报错了。谢谢大家。**

  • 写回答

2条回答 默认 最新

  • 一轮明月照丘壑 2024-10-04 22:16
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    为了更有效地处理这个问题,我们可以采取以下几个步骤:

    1. 分析并优化内存消耗

    • 检查代码:首先,确保你的代码没有不必要的循环、多线程操作或其他可能导致内存泄漏的行为。
    • 使用std::unique_ptr替代传统指针:使用std::unique_ptr可以自动管理其生命周期,防止内存泄露。
    • 减少对象创建:避免频繁地创建新的对象,尤其是在循环中。

    2. 限制最大内存占用

    • 使用#pragma memory预处理器指令来限制对象的最大内存占用量,例如:
      #pragma memory(1024 * 1024)
      
      这将限制所有对象的总大小不超过1MB。

    3. 使用std::vector代替数组

    • 如果你的数据是整数或者字符串,考虑使用std::vector而不是数组。这样可以提高效率并且更容易进行插入和删除操作。

    4. 清理内存

    • 在遍历过程中,每当遇到不再使用的对象时,将其从std::map或者std::unordered_map等容器中移除,以释放其占用的空间。

    5. 调试与性能监控

    • 使用valgrind或者其他内存分析工具对程序进行全面的内存分析,找出可能的内存泄漏点。
    • 定期运行性能监控工具,如gprof(对于C/C++)或htop(Linux),来跟踪程序的资源使用情况。

    示例代码

    如果你正在使用C++,可以参考以下示例代码:

    #include <iostream>
    #include <fstream>
    
    using namespace std;
    
    int main() {
        // 初始化对象
        int obj;
        string str;
    
        // 检查内存泄漏
        if (!obj) {
            cout << "Memory leak detected!" << endl;
            return 1;
        }
    
        // 创建文件流
        ifstream file("log.txt");
        if (!file.is_open()) {
            cerr << "Failed to open log file" << endl;
            return 1;
        }
    
        while (getline(file, line)) {
            // 执行其他操作
            // ...
        }
    
        // 关闭文件流
        file.close();
    
        // 释放内存
        delete [] obj;
        delete [] str;
    
        return 0;
    }
    

    在这个例子中,我们通过使用std::unique_ptr来保证对象的生命周期,并且使用delete[]来释放对象。同时,我们还检查了内存泄漏,当检测到内存泄漏时,程序会输出警告信息并返回错误码。

    请注意,这只是一个基本的例子,实际应用中可能会有更多的细节需要考虑。

    评论

报告相同问题?

问题事件

  • 修改了问题 10月7日
  • 修改了问题 10月7日
  • 修改了问题 10月7日
  • 创建了问题 10月4日