插件窝 干货文章 Linux环境下C++内存管理技巧

Linux环境下C++内存管理技巧

内存 使用 size delete 877    来源:    2025-05-08

Linux环境下C++内存管理技巧

基础内存管理

  1. new/delete操作符

    • 使用new分配内存,delete释放内存
    • 对于数组使用new[]delete[]
    int* ptr = new int(10);  // 分配单个int
    int* arr = new int[10];  // 分配数组
    delete ptr;              // 释放单个
    delete[] arr;            // 释放数组
    
  2. malloc/free与new/delete的区别

    • malloc/free是C库函数,不调用构造/析构函数
    • new/delete是C++操作符,会调用构造/析构函数

智能指针

  1. unique_ptr

    • 独占所有权,不能复制只能移动
    std::unique_ptr<int> uptr(new int(10));
    auto uptr2 = std::move(uptr);  // 所有权转移
    
  2. shared_ptr

    • 共享所有权,使用引用计数
    std::shared_ptr<int> sptr1 = std::make_shared<int>(20);
    auto sptr2 = sptr1;  // 引用计数增加
    
  3. weak_ptr

    • 不增加引用计数,解决循环引用问题
    std::weak_ptr<int> wptr = sptr1;
    if(auto tmp = wptr.lock()) {
       // 使用临时shared_ptr访问资源
    }
    

高级技巧

  1. 自定义内存分配器

    • 重载new/delete操作符
    void* operator new(size_t size) {
       void* p = malloc(size);
       if(!p) throw std::bad_alloc();
       return p;
    }
    
    void operator delete(void* p) noexcept {
       free(p);
    }
    
  2. 内存池技术

    • 预分配大块内存,减少频繁分配开销
    • 适用于大量小对象分配场景
  3. 使用valgrind检测内存泄漏

    valgrind --leak-check=full ./your_program
    

Linux特有工具

  1. pmap查看内存映射

    pmap -x <pid>
    
  2. 使用mlock锁定内存

    • 防止内存被交换到swap分区
    mlock(ptr, size);  // 锁定
    munlock(ptr, size); // 解锁
    
  3. 内存对齐分配

    void* aligned_alloc(size_t alignment, size_t size);
    posix_memalign(&ptr, alignment, size);
    

最佳实践

  1. 优先使用智能指针而非裸指针
  2. 使用RAII(Resource Acquisition Is Initialization)原则管理资源
  3. 对于性能关键代码,考虑使用内存池
  4. 定期使用工具检查内存泄漏
  5. 注意多线程环境下的内存安全问题

性能优化

  1. 使用jemalloc/tcmalloc替代glibc malloc

    LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.1 ./your_program
    
  2. 大页内存(Huge Pages)

    // 在程序启动前设置
    // echo 20 > /proc/sys/vm/nr_hugepages
    void* ptr = mmap(NULL, size, PROT_READ|PROT_WRITE, 
                   MAP_PRIVATE|MAP_ANONYMOUS|MAP_HUGETLB, -1, 0);
    
  3. NUMA感知内存分配

    #include <numa.h>
    void* numa_alloc_onnode(size_t size, int node);
    

通过合理运用这些技巧,可以显著提高Linux环境下C++程序的内存管理效率和安全性。