zoukankan      html  css  js  c++  java
  • 内存泄漏定位以及解决

    1 内存泄漏定位

    1.1 valgrind 

    Valgrind包含下列工具:

    • memcheck:检查程序中的内存问题,如泄漏、越界、非法指针等。
    • callgrind:检测程序代码的运行时间和调用过程,以及分析程序性能
    • cachegrind:分析CPU的cache命中率、丢失率,用于进行代码优化。
    • helgrind:用于检查多线程程序的竞态条件
    • massif:堆栈分析器,指示程序中使用了多少堆内存等信息。

    通过valgrand --tool=name 程序名来分别调用的

    Memcheck:  最常用的工具,用来检测程序中出现的内存问题,所有对内存的读写都会被检测到,一切对malloc、free、new、delete的调用都会被捕获。

    • 对未初始化内存的使用
    • 读/写释放后的内存块
    • 读/写超出malloc分配的内存块
    • 读/写不适当的栈中内存块
    • 内存泄漏,指向一块内存的指针永远丢失
    • 不正确的malloc/free或new/delete匹配

    例子

    int main()
    {
      int * pni=new int();
      void * pmi=malloc(sizeof(int));
      delete pni;
      free(pmi);
      pni=new int();
      pmi=malloc(sizeof(int));
    }
    

      

    1.2 观察内存

    随着程序的运行内存不断增长,根据情况判断是否泄漏。

    2 避免内存泄漏

    2.1 良好的编码习惯

    使用malloc分配的内存,要调用free释放

    malloc ealloc ------  free

    new ew[] ----------  delete delete[]

    2.2 使用RAII管理资源-资源获取即初始化

    本质上说就是将内存的获取放在构造函数,将内存的释放放在析构函数。主要是避免了忘记free或是delete。但是如果没有在析构函数中释放资源,那么RAII也是没多大用处的。

    2.3 share_ptr来管理内存

    类似于GC了

  • 相关阅读:
    HDU-1240 Asteroids! (BFS)这里是一个三维空间,用一个6*3二维数组储存6个不同方向
    HDU-1026 Ignatius and the Princess I(BFS) 带路径的广搜
    HDU-1700 Points on Cycle
    HDU-4515 小Q系列故事——世界上最遥远的距离
    Star
    HDOJ5441(图论中的并查集)
    HDOJ5438(图的各个连通分量遍历)
    HDOJ5044(最近公共祖先)
    C++输入输出知识
    JAVAmap容器基本使用
  • 原文地址:https://www.cnblogs.com/perfy576/p/8566160.html
Copyright © 2011-2022 走看看