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分配器会缓存空闲内存块,短时间内不会将未使用的内存归还给内核,而是留作后续分配复用。随着时间推移,系统会逐步将这些虚拟内存映射到物理内存,最终导致内存占用持续上升直至上限。
修复方案
手动释放内存
在循环中为每个分配的内存块添加delete[]操作:for(int i = 0; i < 6000; ++i) { char* buf = new char[MAX_BUFFER_SIZE]; delete[] buf; // 释放内存 }使用RAII容器自动管理内存
用std::vector替代手动内存分配,容器生命周期结束时会自动释放内存,避免遗漏:#include <vector> // ... for(int i = 0; i < 6000; ++i) { std::vector<char> buf(MAX_BUFFER_SIZE); // 无需手动释放,离开作用域自动回收 }工具验证泄漏
用valgrind工具可以直接定位泄漏点,确认问题:valgrind --leak-check=full ./your_compiled_program
内容的提问来源于stack exchange,提问作者Pacou
相关产品推荐
相关产品推荐

