`
ijavagos
  • 浏览: 1193138 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

C语言中的malloc和free造成内存泄露?

 
阅读更多

来源:http://blog.csdn.net/Leisure512/article/details/4787585

首先,说一下我对内存泄露的理解,内存泄露是指:程序中一块不再使用的内存没有被释放,造成内存保持占用状态,使操作系统不能将内存分配给其它的程序(进程)。在C语言,用的最多的管理内存的函数莫过于malloc和free了,下面我用VC6.0做了一个小测试,源码如下:

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. intmain(){
  4. int*pint=(int*)malloc(sizeof(int));
  5. int*pp=(int*)malloc(sizeof(int));
  6. char*pchar=(char*)pint;
  7. *pp=16705;
  8. *pint=16705;
  9. free(pchar);
  10. free(pp);
  11. return0;
  12. }

然后,使用VC6.0来调试这个程序,单步执行,对于这个程序,没有step in的地方,除非你要想去看看malloc和free怎么执行。我全部使用单步执行(step out)。下面有一些截图:

图1.执行完两条malloc以后

从图1可以看到,VC实现的malloc函数给连续声明的两个int变量分配的内存相隔很远!

图2.pint地址的内容

从图2中可以看到,由于没有给*pint赋值,所以这块内存中的值为dirty。

现在将pint强制转换成char *,然后赋给pchar,现在pchar和pint指向同一个内存地址,现在给*pint赋值为16705,这个值是特别设计的,因为它的有效的两个字节转化成ASCII码后是AA,从图3中可以看出,当前PC上的内存是小端对其的。

图3.给*pint赋值后

赋值以后查看*pchar和pchar内存的内容,如下:

图4.赋值以后的变量

从图4中可以看到,*pchar表示一个char值'A',而pchar是一个字符串"AA",因为char *可以指向一个字符串的首地址,而字符串以字符'/0'结束,也就是整数0结束。而这时从图3中可以看到,内存中的值为41410000...,转换成ASCII码就是AA,然后跟上结束符。

现在该执行free了,如下图

图5.free(pchar)执行以后的内存图

可以看到,free(pchar)这个char *一共free了9个字节的内存!然后执行下一句,如下图

图6.free(pp)执行以后的内存图

从图6中可以看到,free一个int*时,free掉了10个字节的内存!

最后,从上面的实验中是否可以得出下列结论呢?

1.malloc分配的内存至少要满足请求的内存大小

2.即使两个变量相邻使用malloc分配获得的内存地址也相隔甚远

3.将int*强制转换成char*后,会造成内存泄露(如上例中,有一个字节没有被free掉)

分享到:
评论

相关推荐

    C语言面试题-求职必备收藏备用.docx

    C语言面试题 以下是一些常见的C语言面试题,这些问题覆盖了基本语法、指针、内存管理、... - 什么是内存泄漏?如何检测和避免? - `free` 函数用于释放内存,使用时需要注意什么? - 什么是缓冲区溢出?如何防止?

    【JavaScript源代码】一篇文章弄懂javascript内存泄漏.docx

    一篇文章弄懂javascript内存泄漏 ... 然后在理解泄漏之前, 我们的了解下内存的管理, 在一些底层语言中, 如C语言, 内存是需要开发者自己分配和释放的, 通过malloc、free等函数进行内存管理. &lt;pre class=

    C语言内存分配详解

    1、C中内存分为四个区 栈:用来存放函数的形参和函数内的局部变量。由编译器分配空间,在函数执行完后由编译器自动释放。 堆:用来存放由动态分配函数(如malloc)分配的空间。是由程序员自己手动分配的,并且必须...

    C语言中的一些算法和面试题

    C语言作为一种经典的程序设计语言,在算法和面试题方面有着广泛的应用。掌握C语言算法和面试题不仅能够加深对语言本身的理解,更能够培养逻辑思维能力和解决问题...4. 内存管理:如malloc/free使用、内存泄漏、内存对齐等

    C语言中的内存泄露 怎样避免与检测

    有些程序并不需要管理它们的动态内存的使用。...由于C语言通常并不使用垃圾回收器(自动确认并回收不再使用的内存块),这些C程序在使用malloc()和free()时不得不非常慎重。堆经常会出现两种类型的问题:1.释放或改

    MemLeak内存泄漏检测工具

    MemLeak 是一个C语言内存泄漏检测工具... 原理是利用 C 语言的宏调用来替代原有的函数调用, memleak 维护了一个链表,在这个链表中保存着程序中对内存函数调用的记录,这些函数包括:malloc、calloc、realloc、free。

    linux 下内存检测工具valgrid3.5

    Valgrind 是一款 Linux下(支持 x86、x86_64和ppc32)程序的内存调试工具,它可以对编译后的二进制程序进行内存使用监测(C语言中的malloc和free,以及C++中的new和delete),找出内存泄漏问题。

    C 语言检测内存泄露的方法(例子)

    C 语言检测内存泄露的方法 提供了例子 供大家参考 封装了malloc free函数

    vld(Visual Leak Detector 内存泄露检测工具 源码)

     可以看出,对于每一个内存泄漏,这个报告列出了它的泄漏点、长度、分配该内存时的调用堆栈、和泄露内存的内容(分别以16进制和文本格式列出)。双击该堆栈报告的某一行,会自动在代码编辑器中跳到其所指文件的对应...

    详解C语言中的指针与数组的定义与使用

    指针的特点 他就是内存中的一个地址 指针本身运算 指针所指向的内容是可以操作的 操作系统是如何管理内存的 栈空间 4M~8m的大小 ...// 如果使用完不去释放会照成内存泄漏和野指针的出现 free(men)

    C 中的粒子 群 优化(PSO)_c语言_代码_下载

    不要忘记使用 释放对象pso_settings_free(),尤其是当您在循环上进行多次优化尝试时(否则内存会泄漏)。 特征 邻域拓扑 pso 提供了三种不同的策略来确定每个粒子的邻域吸引子: 更多详情、使用方法,请下载后阅读...

    valgrind-3.6.1.tar.bz2

    Valgrind 是一款 Linux下(支持 x86、x86_64和ppc32)程序的内存调试工具,它可以对编译后的二进制程序进行内存使用监测(C语言中的malloc和free,以及C++中的new和delete),找出内存泄漏问题。

    JavaScript内存泄漏的处理方式

    像C语言这样的编程语言,具有简单的内存管理功能函数,例如malloc( )和free( )。开发人员可以使用这些功能函数来显式地分配和释放系统的内存。 当创建对象和字符串等时,JavaScript就会分配内存,并在不再使用时自动...

    中高级前端必须了解的JS中的内存管理(推荐)

    像C语言这样的底层语言一般都有底层的内存管理接口,比如 malloc()和free()用于分配内存和释放内存。 而对于JavaScript来说,会在创建变量(对象,字符串等)时分配内存,并且在不再使用它们时“自动”释放内存,这...

    lab_garbage_collector.rar_Free!_Garbage Collector_garbage lab_ma

    系统级编程实验,利用C语言实现垃圾回收器,避免在malloc分配内存后忘记free,导致内存泄漏等一些严重后果

    C/C++程序内存的各种变量存储区域和各个区域详解

    C/C++不提供垃圾回收机制,因此需要对堆中的数据进行及时销毁,防止内存泄漏,使用free和delete销毁new和malloc申请的堆内存,而栈内存是动态释放。全局变量、静态局部变量保存在全局数据区,初始化的和未初始化的...

    C++复试和面试题汇总

    语言基础 1、简述 C++语言的特点 • C++在 C 语言的基础上引入了面向对象的机制,同时兼容 C 语言; • C++面向对象包括了封装、继承、...C 语言和 C++的内存管理不太一样,C 中使用 malloc 和 free,C++中使用

    最新名企标准通用C++面试题,

    程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。 16.是不是一个父类写了一个virtual 函数,如果子类...

    c/c++ 学习总结 初学者必备

    程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。 5,、解释堆和栈的区别? 答: (1)栈区(stack):由编译器...

Global site tag (gtag.js) - Google Analytics