malloc函数

malloc函数的原型:

(void *)malloc(int size)

malloc函数的返回值是一个void类型的指针,参数为int类型的数据,即申请分配的内存大小,单位是字节。内存分配成功之后,malloc函数返回这块内存的首地址,你需要一个指针来接受这个地址。但是由于函数的返回值是void *类型,所以必须强制转换成你所接收的类型。也就是说这块内存将来要用来存储什么类型的数据,比如

char *p = (char *)malloc(100);

在堆上分配了100个字节的内存,返回这块内存的首地址,把地址强制转换成char *类型后,赋给char *类型的指针变量p;同时告诉我们这块内存将用来存储char类型的数据。也就是说你只能通过指针变量p来操作这块内存。这块内存本身没有名字,对它的访问是匿名访问

使用malloc函数同样要注意这点:如果所申请的内存块大于目前堆上剩余的内存块(整块),则内存分配就会失败,函数函数NULL。注意这里说的是“堆上剩余内存块”不是所有剩余内存块之和,因为malloc函数申请的是连续的一块内存。既然malloc函数申请内存又不成功的可能,那我们在使用指向这块内存的指针时,必须用if( NULL != p)语句上来验证内存分配确实成功了。

内存泄漏

在C语言程序设计中,内存泄漏几乎是很难避免的,C程序产生泄漏内存,则运行速度会逐渐变慢,并最终停止运行;如果产生覆盖内存,程序会变得非常脆弱,很容易受到恶意用户的攻击。内存泄漏是一种隐性危害,它们很难被发现,通常不能在相应的源代码中找到错误,需要仔细分析与专门的检测工具才能发现。

(1)内存泄漏的定义

通常我们所说的内存泄漏,是指分配出去的内存在使用之后没有释放掉,没有回收,长此以往,会造成没有足够的内存可以分配。一般表现为运行时间越长,占用的内存越多,最终导致系统奔溃。一般的内存泄漏是指堆内存的泄漏。堆内存是指程序从堆中分配的,大小任意的(内存块的大小可以在程序运行期决定),使用完后必须显式释放的内存。应用程序一般使用malloc,realloc,new等函数从堆中分配到一块内存,使用完后,程序必须负责相应的调用free或delete释放该内存块,否则,这块内存就不能被再次使用,我们就说这块内存泄漏了。

(2)内存泄漏的原因

2.1 C语言内存分配情况 
  在C语言中,根据数据在内存中存在的时间(生存周期)不同,将内存空间分为三个区:

1)程序区:用于存储程序的代码,即程序的二进制代码。

2)静态存储区:用于存储全局变量和静态变量,这些变量的空间在程序编译时就已经分配好了。

3)动态存储区:用于在程序执行时分配的内存,又分为:堆区(heap)和栈区(stack)。堆区:用于动态内存 分配,程序运行时由内存分配函数在堆上分配内存。在C语言中,只能使用指针才能动态的分配内存。栈区:在 函数执行时,函数内部的局部变量和函数参数的存储单元的内存区域,函数运行结束时,这些内存区域会自动释 放。 
  2.2 C语言动态内存分配 
  在C语言中用内存分配函数来实现内存的动态分配,这些函数有:malloc()和realloc()等函数。malloc():使用这个 函数时需要包含头文件。使用该函数需要指定要分配的内存字节数作为参数,例如: 
  int *pNumber=(int *) malloc(100) 
  这条语句分配了100个字节的内存,并把这个内存块的地址赋给pNumber,这个内存块可以保存最大25个int值, 每个int占4个字节。如果不能分配请求的内存,malloc()会返回一个null指针。 
  2.3 释放动态分配的内存 
  堆上分配的内存会在整个应用程序结束之后,由操作系统负责回收,但最好是在使用完这些内存后立即释放。如 果不释放,会引起内存泄漏,极大占用系统资源,可能会产生各种未知的错误。所以,必须使用free()函数释 放内存,参数是内存地址(指针),例如:free(pNumber),依上例。

(3)内存泄漏避免的方法 

3.1正确使用malloc函数分配内存 
  malloc是一个函数,专门用来从堆上分配内存。使用malloc函数需要几个要求:内存分配给谁?分配多大内存? 是否还有足够内存分配? 内存将用来存储什么格式的数据?分配好的内存在哪里? 如果这5点都确定,那内存就 能分配。下面看看malloc的原型:(void *)malloc(int size) 
  malloc函数的返回值是一个void类型的指针,参数为int类型的数据,即申请分配的内存大小,单位是字节。内存 分配成功之后,malloc函数返回这块内存的首地址,你需要一个指针来接受这个地址。也就是说这块内存将来要 用来存储什么类型的数据,如: 
  char *p = (char *)malloc(100) 
  在堆内存分配了100个字节的内存,返回这块内存的首地址,把地址强制转换成char *类型后赋给char *类型的指 针变量p;同时告诉我们这块内存将用来存储char类型的数据。你只能通过指针变量p来操作这块内存,这块内存 本身没有名字,对它的访问是匿名访问。但是,不一定每次malloc函数都能成功分配到内存。既然malloc函数申 请内存存在不成功的可能,那我们在使用指向这块内存的指针时,必须用if( NULL != p)语句上来验证内存分 配确实成功了。

  3.2 正确使用free函数释放内存 
  既然有分配,那就必须有释放,不然的话,有限的内存就会用光,而没有释放的内存却占用空间,与malloc对应 的就是free函数了。free函数只有一个参数,就是所要释放的内存块的首地址(指针)。按上例,则 为:free(p).free函数其实它就做了一件事:斩断指针变量和这块内存的对应关系。free函数就是把这块内存和p 之间的关系斩断;p本身的值并没有改变或者消失,即指针变量p本身保存的地址并没有改变,那块被释放的内存 里面保存的值也没有改变。这就是free函数的功能,一个malloc对应一个free,是一夫一妻制。在使用free(p) 函数内存释放后,指针变量p本身保存的地址并没有改变,那我们必须需重新把p的值变为NULL:p = NULL。如 果没有把该指针置NULL,这个指针就成为了“悬空指针”,这是很危险的,且也是经常出错的地方。

关于C语言的malloc函数以及内存泄漏的问题相关推荐

  1. c语言malloc用法 数组,详解C语言用malloc函数申请二维动态数组的实例

    详解C语言用malloc函数申请二维动态数组的实例 C语言在程序运行中动态的申请及释放内存十分方便,一维数组的申请及释放比较简单. Sample one #include int main() { c ...

  2. malloc函数分配内存失败的原因及解决方法

    原文链接:http://blog.csdn.net/lighthear/article/details/70146602 malloc函数分配内存失败的原因及解决方法 先说结论 malloc()函数分 ...

  3. 【方案篇】事件监听函数的内存泄漏,帮你搞定!不谢!!!

    本文是 理论篇 ,还有下篇 代码篇. 前言 工作中,我们会对window, DOM节点,WebSoket, 或者单纯的事件中心等注册事件监听函数. // window window.addEventL ...

  4. c语言之 malloc函数详解 在堆中动态分配内存malloc和new的区别

    一.原型:extern void *malloc(unsigned int num_bytes); 头文件:#include <malloc.h> 或 #include <alloc ...

  5. C语言动态数组(malloc()函数动态分配内存)

    malloc()函数简介 头文件:<stdlib.h> 或者 <malloc.h>. 函数声明: void *malloc( int size ); 用法: (分配类型 * ) ...

  6. c语言:malloc函数的简介

    文章目录 一.为什么需要malloc函数? 二.如何使用malloc函数? 三.用malloc函数自定义数组长度 一.为什么需要malloc函数? 用于解决传统数组以下缺点. ①传统数组的长度必须要事 ...

  7. C语言调用 free 函数释放内存后指针指向及内存中的值是否改变的问题

    文章目录 1. 前言 2. 正文 2.1. "分配" 与 "释放" 2.2. 运行测试 2.2.1. VSCode 下使用 gcc 编译 2.2.2. VS20 ...

  8. c语言的free函数与内存空间释放

    目录 0 缘起 1 free() 使用前 - free前程序做了什么 2 free 的作用 - free对内存做了什么 - free对指针做了什么 3 free后怎样做 4 Q&A (1) Q ...

  9. malloc()函数实现内存动态分配

    c语言中,变量在使用前必须被定义并且安排好存储空间,全局变量.静态局部变量的存储空间是在编译时确定,在程序开始执行前完成.函数参数.局部变量是在执行函数或者进入变量定义所在的复合语句时为它们分配存储空 ...

最新文章

  1. C++——包装器std::function与绑定器std::bind
  2. NodeJS起步两三事
  3. 用php写shell,php与shell实现多线程的简单例子
  4. VTK修炼之道1_初识VTK
  5. 大工计算机应用基础在线测试2,大工15秋《计算机应用基础》在线测试2
  6. 计算机网络期中考试题周静,期中考试优秀作文
  7. Hibernate的generator属性
  8. 1575 Gcd and Lcm
  9. asp.net mvc 如何在View中获取Url参数的值
  10. java环境变量的配置步骤,实现原理分析
  11. Codeforces 754E:Dasha and cyclic table
  12. unicode编码 php,PHP 的 UNICODE 编码和解码
  13. Python学习笔记10:内建结构
  14. Android 属性动画实现一个简单的PopupWindow
  15. 圈圈教你玩usb第一版硬件实物图
  16. windows如何设置新建文本文档快捷键
  17. 深度时空3D卷积神经网络用于交通预测(文末附数据链接)
  18. 小型餐厅管理系统 java_小型餐饮管理系统的设计与实现(JSP,MySQL)
  19. 《期权、期货及其他衍生产品》读书笔记(第二章:期货市场与中央交易对手)
  20. 影视之我看——写自己的剧本

热门文章

  1. 【Spring】Spring Security介绍及其入门案例
  2. 成为阿里P7移动架构师到底有多难?不是吧阿sir
  3. 如何用来逗微信图文编辑器整理高质量的端午节公众号文章
  4. 【windows】让windows10保持常亮(不息屏,不锁屏,不进入屏保)
  5. 如何让你的机器更加聪明?-知识图谱介绍与构建
  6. 酷比魔方talk8x官方线刷教程疑问解析
  7. android 9 手机硬件性能,安兔兔公布5月安卓性能榜:小米9意外下滑,第一名跑分38W! - 王石头...
  8. 江小白包装设计原型_江小白,将简单做到极致的包装是品牌传播的先行军
  9. dev控件之图表显示
  10. 如何将照片文字转换成word