You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rocky Linux下动态内存分配引发延迟内存泄漏问题求助

问题分析与解决:Rocky Linux 8.8下gcc 8.5编译代码的内存泄漏问题

在Rocky Linux 8.8系统中,使用gcc 8.5编译以下代码后,执行时无bad_alloc报错,但约30分钟后会出现内存泄漏直至达到系统内存上限;移除动态内存分配逻辑则无此问题。

测试代码:

#include <iostream>

#define MAX_BUFFER_SIZE 65535

int main()
{
    ///////////// Without this dynamic allocation no memory leak
    for(int i = 0; i < 6000; ++i)
    {
        new char[MAX_BUFFER_SIZE];
    }

      // The std::cin below shows after 30 minutes that a memory leak is occurring
      // It increases until it reaches a ceiling
    
    char c;
    
    std::cout<< "Press key to exit"  << std::endl;

    std::cin >> c;

    return 0;
}

问题根源

这段代码存在显式内存泄漏:循环中通过new分配了6000块大小为65535字节的内存,但没有执行对应的delete[]操作,导致这些内存块被永久占用,无法被系统回收。

之所以不是立刻达到内存上限,是因为Linux系统和glibc内存分配器的特性:

  • Linux采用延迟物理内存分配:调用new时仅分配虚拟内存空间,实际物理内存要等到内存页被访问时才会分配。
  • glibc的ptmalloc2分配器会缓存空闲内存块,短时间内不会将未使用的内存归还给内核,而是留作后续分配复用。随着时间推移,系统会逐步将这些虚拟内存映射到物理内存,最终导致内存占用持续上升直至上限。

修复方案

  1. 手动释放内存
    在循环中为每个分配的内存块添加delete[]操作:

    for(int i = 0; i < 6000; ++i)
    {
        char* buf = new char[MAX_BUFFER_SIZE];
        delete[] buf; // 释放内存
    }
    
  2. 使用RAII容器自动管理内存
    用std::vector替代手动内存分配,容器生命周期结束时会自动释放内存,避免遗漏:

    #include <vector>
    // ...
    for(int i = 0; i < 6000; ++i)
    {
        std::vector<char> buf(MAX_BUFFER_SIZE);
        // 无需手动释放,离开作用域自动回收
    }
    
  3. 工具验证泄漏
    用valgrind工具可以直接定位泄漏点,确认问题:

    valgrind --leak-check=full ./your_compiled_program
    

内容的提问来源于stack exchange,提问作者Pacou

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 16:57:31