C接口与实现---内存管理

内存管理

全部不平凡的程序都会运行在一个运行期分配的内存上。 ---匿名者java

c如此java已经是如此,只不过这些语言有一套强大额内存管理机制。c之强大也在于此,给你足够的管理权限,让你在程序的世界里挥洒自如。倚天剑,屠龙刀你驾驭很差的话可能会伤到本身,阁下能够当心。程序员

以为这与当时的设计环境有关, 话说C语言和以后的Unix只是Thompson和Ritchie两位大神在Bell Labs的side project,两个项目交界期搞的一个东西,当时设计C语言的目的就是设计一门语言来时从新设计操做系统,设想的使用者应该是那些Bell的大牛们,并非为大众而设计的。固然后来他们没想到这两个项目是如此的成功,以致于对以后整个软件开发产生如此深远的影响,估计他们也是始料未及的。我等能在其上写代码,应该感谢前辈们的积累。算法

C里面的内存管理

C语言的标准库提供了四个函数:malloc, calloc, realloc, free来容许程序员本身管理内存单元。若是裸着使用这些函数的话可能会出不少问题,本章中咱们用一系列的宏从新包装了这些函数,使其错误更好。C最多见的内存错误就是悬空指针了,相似下面的代码:数组

p = malloc(nbytes);
 ....
 free(p)
 ....
 if (p)
     ....

这里的p就是一个悬空指针,咱们释放了p指向的内存空间,可是并无将其置为NULL,
以后的代码也作了NULL check,最终程序就会出现很奇怪的异常。这里必须介绍一个工具valgrind, 一款强大的memory leak检测工具。使用也很简单ide

valgrind --tool=memcheck --leak-check=yes ./a.out

就能检测出leak的大体代码。函数

中间断断续续总算把第五章的内容看完了,后半部分主要讲了一下first fit的内存分配算法。顾名思义,first fit就是在空闲的列表里面找一个第一个合适空间然(不必定是最好的)后在其上面分配。首先所用的空间是用一个指针数组来管理。工具

static struct descriptor {
  struct descriptor *free;
  struct descriptor *link;
  const void *ptr;
  long size;
  const char *file;
  int line;
} *htab[2048];

这里的htab是一个hash表,地址为hash值, 将相同hash值的描述块用link来连接起来,一样的空闲链表也是经过free连接起来的。这里free为空就表示这个块是被分配的,若是非NULL的他就是空闲列表中的一员,下次分配的时候就可使用。
memspa

这里还有一点须要注意的就是每次找到合适的块以后的处理方式,malloc须要分配一个50 bytes的空间,根据first fit咱们找到了一个100 bytes的空间,这里咱们从100 bytes里面分配了64(这里须要考虑到对其),那么剩下的36 bytes就须要添加描述符后从新添加到空闲列表里面去。操作系统

后面翻了下K&R C第二版的8.7节也讲了一个相似的例子,有时间能够翻翻。设计

看到习题处真的要再次的夸下这本书,可是还在想每一个块内存中确定会有16bytes的空间没法释放也没法使用的时候,在习题中看到了这个思考题。

-END-

相关文章
相关标签/搜索