这几天在实验室写代码,从以前习惯的 Java 环境一下子回到了纯 C 语言的时代,有点不太适应。不过 C 语言确实是最灵活最强大的,简直就像乾坤大挪移,内功不够的人只能徒然兴叹,纵如杨逍之类的绝世高手也不过习得入门皮毛。——所以,先修内功~~
C 语言和 Java 一个很明显的不同,就是需要程序员自己来手动释放内存,所以刚开始回到 C 环境的时候,确实被内存泄露搞得焦头烂额。为了不在程序里埋下隐患,我决定还是仔细学习一下系统内存的动态分配和释放的一些知识吧。
内存的管理,这个当然是操作系统的事,如果是个开源的操作系统,比如UNIX,我们还可以修改内存管理的行为。但是操作系统是怎么来管理内存的呢?我刚开始以为这是个很简单的事情,比如我想申请 100 个 char 的空间,于是 char *p = (char *) malloc(100*sizeof(char)) 得到指向这块内存首地址的指针,要是用完了,直接 free(p),完事。——虽然事实上差不多就是这样的,但是这个过程中的很多细节问题我从来没有想过。
首先一个最直接的问题,我们都知道 C 语言是没有函数重载的,也就是说函数的参数类型是唯一的,但是 free 函数接收的参数却可以是任意类型的指针,为什么呢?——当然这个问题很简单,因为 free 函数接收的参数类型是 void * 指针,任何其他类型的指针都可以转化为 void * 指针,所以 free 函数可以释放任意指针指向的内存。
说到这里就不得不说一下指针类型,为什么在使用的时候一定要指定指针类型呢?因为使用的时候需要知道指针指向实际内容的大小,一个 char * 就指向一个 1B 的空间,一个 long * 就指向一个 4B 的空间,这样在移动指针的时候才能够移到正确的位置。比如一个 char *p,那么 p++ 就将指向下一个 Byte,如果是 long *p,那么 p++ 就指向 4Btye 之后的地址。
新的疑问又来了,既然 free 函数接收的是一个 void * 指针,那他怎么知道到底该释放多少内存?
事实上,系统在管理、分配内存的时候,并不简单地将一块空内存的首地址返回给你,而是记录了一点额外的信息。事实上,在你用 malloc 申请的内存地址前面,系统自己附了一个结构体,用来记录一些管理信息,比如这块内存块的大小,下一个可用的内存块的地址……啊等等等等。这些东西当然是不会给你看到的,所以系统就放在返回给你的内存块的前面,所以你得到的指针指向的就是一块空白的内存。
利用这个额外的信息,那么释放内存就变得容易了,在 free 函数里,根据接收到的指针得到需要释放的内存块的首地址,然后往前倒退几个字节,找到那些额外的信息,根据这些信息,很容易就能知道应该释放多少内存。从这点上来说,即使你将一个 char * 强制转换成了 long * 那么在使用 free 释放的时候也一样只是释放了 1B 的大小。
以上只是一个简单的笔记,给自己留一个备份,主要是记录一些想法,有些地方欠缺严谨。再加上我对这块内容也是了解不够,因此只能说与大家分享吧,也希望有牛人来指点指点,一起讨论。
references:
http://topic.csdn.net/u/20081107/17/a0e8e8d0-1b30-459e-a640-53966f3e7640.html
http://topic.csdn.net/u/20090714/07/9ee25af0-8ecf-42e9-9ae5-ec2bdd1f72b8.html
http://blog.chinaunix.net/u3/93713/showart_2113389.html
http://g.oswego.edu/dl/html/malloc.html
分享到:
相关推荐
浅谈C中的malloc和free
用C自己实现malloc和free,需要的可以看下,没实际用处,不过可以了解C的原型原理
在VC2008上实现malloc和free,内含注释以及图形解释
自己实现的malloc 和 free 用的双向链表 尽量做了注释
定义了一个10M大小的数组,每次分配空间都从这10M中分配,原理是分配的时候空间足够...模拟动态内存分配,模拟malloc和free。 自己的作业,当然也有很多欠缺的地方,比如没有考虑多线程同时调用这类的问题。仅供参考。
C语言的malloc和free函数.pdf
由于malloc/free 是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的 任务强加于malloc /free. 3 ,因此C++ 语言需要一个能完成动态内存分配和初始化工作的运算符new ,以一个能完成...
实现自己的mem_malloc和mem_free
详述了内存管理中malloc和free的用法
主要介绍了C语言基础之malloc和free函数详解的相关资料,需要的朋友可以参考下
malloc_free.exe
详细介绍了c语言中malloc()和free()的基本用法、概念和机制
malloc/free和new/delete的区别 malloc/free是C/C++标准库的函数;new/delete是C++操作符。 malloc/free只是动态分配内存空间/释放空间;new/delete除了分配空间还会调用构造函数和析构函数进行初始化与清理资源。...
C语言中内存的管理主要是依据malloc和free实现的,其中malloc主要是实现内存的分配,而free则是实现内存的释放。虽然这是我们已经很熟悉的,但是还是存在一些问题。特别是当结构体中存在指针的情况下,各种问题也就...
Malloc和mfree函数的实现原理,可参考
malloc和calloc区别 函数malloc()和calloc()都可以用来动态分配内存空间,但两者稍有区别。 malloc()函数有一个参数,即要分配的内存空间的大小: void *malloc(size_t size); calloc()函数有两个参数,分别为元素...
Malloc()与free()是C++/C语言的标准库函数,new/delete是C++的运算符,它们都可用于申请和释放动态内存。
昨日在子函数中用malloc申请内存使用后,意外发现在free的时候出现异常错误,后经检查发现原来是实际使用时指针长度超过了申请的范围。
介绍malloc与free函数的用法,并利用C语言自己实现malloc与free函数,完成内存管理。