什么是内存泄漏

内存泄漏是指程序动态申请的内存在使用完后没有释放,导致这段内存不能被操作系统回收再利用。

比如这段程序,申请了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!\n");
return 0
}

方法分析

  • 长处:

直观。easy理解,easy实现

  • 缺点:

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

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

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

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

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

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

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

改进

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

linux中内存泄漏的检測(一)最简单的方法的更多相关文章

  1. linux中内存泄漏的检測(五)记录内存泄漏的代码

    到眼下为止,先后通过wrap malloc.new函数重载和计算指针内存大小的方法.基本上满足了对内存泄漏检測的须要. 假设发现了内存泄漏.那么就要找到内存泄漏的地方而且修正它了. 茫茫代码.如何去找 ...

  2. Linux下内存泄漏工具【转】

    转自:http://www.cnblogs.com/guochaoxxl/p/6970090.html 概述 内存泄漏(memory leak)指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况 ...

  3. Linux下内存泄漏工具

    概述 内存泄漏(memory leak)指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况,在大型的.复杂的应用程序中,内存泄漏是常见的问题.当以前分配的一片内存不再需要使用或无法访问时,但是却 ...

  4. 深入理解Linux中内存管理

    前一段时间看了<深入理解Linux内核>对其中的内存管理部分花了不少时间,但是还是有很多问题不是很清楚,最近又花了一些时间复习了一下,在这里记录下自己的理解和对Linux中内存管理的一些看 ...

  5. C++中内存泄漏的检测方法介绍

    C++中内存泄漏的检测方法介绍 首先我们需要知道程序有没有内存泄露,然后定位到底是哪行代码出现内存泄露了,这样才能将其修复. 最简单的方法当然是借助于专业的检测工具,比较有名如BoundsCheck, ...

  6. linux中内存使用原理

    首先介绍一下linux中内存是如何使用的. 当有应用需要读写磁盘数据时,由系统把相关数据从磁盘读取到内存,如果物理内存不够,则把内存中的部分数据导入到磁盘,从而把磁盘的部分空间当作虚拟内存 来使用,也 ...

  7. linux中内存使用,swap,cache,buffer的含义总结

    首先介绍一下linux中内存是如何使用的.当有应用需要读写磁盘数据时,由系统把相关数据从磁盘读取到内存,如果物理内存不够,则把内存中的部分数据导入到磁盘,从而把磁盘的部分空间当作虚拟内存来使用,也称为 ...

  8. Android开发常见的Activity中内存泄漏及解决办法

    上一篇文章楼主提到由Context引发的内存泄漏,在这一篇文章里,我们来谈谈Android开发中常见的Activity内存泄漏及解决办法.本文将会以“为什么”“怎么解决”的方式来介绍这几种内存泄漏. ...

  9. Linux课程---12、linux中内存指令(top命令的作用是什么)

    Linux课程---12.linux中内存指令(top命令的作用是什么) 一.总结 一句话总结: top实时观察进程.内存和CPU情况 1.电脑出现反应慢情况,最先想到的是什么? 内存 2.linux ...

随机推荐

  1. BZOJ 1355 KMP中next数组的应用

    思路: 我们知道 next[i]是失配的i下一步要去哪儿 next[n]就是失配的n要去哪儿 n-next[n]就是答案(即最短周期)啦 //By SiriusRen #include <cst ...

  2. POJ 2437 贪心+priority_queue

    题意: 思路: 贪心 能不覆盖的就不盖 写得很乱 左闭右开的 temp //By SiriusRen #include <queue> #include <cstdio> #i ...

  3. Domino系统从UNIX平台到windows平台的迁移及备份

    单位机房的一台服务机器到折旧期了,换成了新购IBM机器X3950,而且都预装了windows 2003 server 标准版,所以只有把以前在Unix平台下跑的OA系统迁移到新的windows 200 ...

  4. RLF。HRLF解释

  5. 【习题 8-7 UVA - 11925】Generating Permutations

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 让你把排列1..n变换成对应的输入序列. 每次可以交换前两个数字,或者把第一个数字放到末尾去. 可以逆向考虑. 即把无序的序列变换成 ...

  6. POJ——T 2406 Power Strings

    http://poj.org/problem?id=2406 Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 50627   ...

  7. new不抛出异常nothrow与new_handler

    可以看这里: http://blog.csdn.net/huyiyang2010/article/details/5984987 现在的new是会抛出异常的,bad::alloc 如果不想抛出异常两种 ...

  8. nginx学习十一 nginx启动流程

    今天用了一天的时间看nginx的启动流程,流程还是非常复杂.基本的函数调用有十几个之多.通过看源代码和上网查资料,弄懂了一些函数.有些函数还在学习中,有些函数还待日后学习,这里记录一下今天所学.加油! ...

  9. libssh2进行远程运行LINUX命令

    /** * CSSHClient.h * @file 说明信息.. * DATE February 13 2015 * * @author Ming_zhang */ #ifndef _CSSHCLI ...

  10. HTTP协议建立连接、通讯与关闭连接全过程

    为解决服务器TimeWait多的问题,了解了一下TCP/IP协议的连接过程.以访问一静态页面为例,从建立连接到访问拿到数据,然后关闭的整个过程.使用EtherPeek截图如下:   图首为一次交互过程 ...