zoukankan      html  css  js  c++  java
  • linux中内存泄漏的检測(一)最简单的方法

    什么是内存泄漏

    内存泄漏是指程序动态申请的内存在使用完后没有释放,导致这段内存不能被操作系统回收再利用。
    比如这段程序,申请了4个字节的空间但没有释放,有4个字节的内存泄漏。

    #include <iostream>
    using namespace std;
    
    int main()
    {
         int *p = new int(1);
         cout <<*p<<endl;
         return 0
    }

    随着时间的推移。泄漏的内存越来越多,可用的内存越来越少,轻则性能受损,重则系统崩溃。

    普通情况下,发生内存泄漏时,重新启动就能够回收泄漏的内存。可是对于linux,通常跑的是server程序,不能够任意重新启动,在内存泄漏问题上就要格外小心。

    内存泄漏特点

    1. 难复现 — 要执行到足够长的时间才会暴露。

    2. 难定位 — 出错位置是随机的,看不出与内存泄漏的代码有什么联系。

    最简单的方法

    为了避免写出内存泄漏的程序。一般会有这种编程规范,要求我们在敲代码时申请和释放成对出现的。由于每一次申请都意味着必须有一次释放与它相相应。

    基于这个特点。一种简单的方法就是在代码中统计申请和释放的次数,假设申请和释放的数量不同。就觉得是内存泄漏了。

    #include "stdio.h"
    #include "stdlib.h"
    
    int malloc_count, free_count;
    
    void * my_malloc(int size)
    {
         malloc_count++;
         return malloc(size);
    }
    void my_free(void *p)
    {
         free_count++;
         free(p);
    }
    int main()
    {
         count = 0;
         int *p1 = (int *)my_malloc(sizeif(int))
         int *p2 = (int *)my_malloc(sizeif(int))
         printf("%d, %d", p1, p2);
         my_free(p1);
         if(malloc_count != free_count)
             printf("memory leak!
    ");
         return 0
    }

    方法分析

    • 长处:

    直观。easy理解,easy实现

    • 缺点:

    1.该方法要求执行结束时对执行中产生的打印分析才干知道结果。

    2.该方法要求封装所有申请和释放空间的函数,并在调用的地方改动成调用封装后的函数。尽管C中申请/释放内存接口并不多。可是对于一个大型的项目,调用这些接口的地方却是非常多的,要所有替换是一个比較大的工作量。

    3.仅仅对C语言适用,不能应用于C++

    4.对于所调用的库不适用。

    假设希望应用于库,则要改动库代码

    5.仅仅能检測是否泄漏,却没有详细信息,比方泄漏了多少空间

    6.不能说明是哪一行代码引起了泄漏

    改进

    这个方案尽管简单的,却有很多的不足,无法真正应用于项目中。欲知如何改进,且看下回分解。

  • 相关阅读:
    2013第五周上机任务【项目1 三角形类(构造函数)】
    Google搜索小技巧
    项目总结:文件上传(MVC uploadify)
    Oracle 触发器 Update 不能操作本表的疑问
    【笔试题STL】求两个vector的交集
    Zookeeper(六)数据模型
    是的,我们真的在遭遇有史以来最大的DDoS攻击,并且还在加剧
    在MFC框架下使用osg报内存泄露的解决办法
    NetBeans 时事通讯(刊号 # 107 Jun 25, 2010)
    VS 2008中的C/C++静态代码分析工具Prefast
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/7069470.html
Copyright © 2011-2022 走看看