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

内存管理

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

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检测工具。使用也很简单

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的他就是空闲列表中的一员,下次分配的时候就可以使用。
C接口与实现---内存管理_第1张图片

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

后面翻了下K&R C第二版的8.7节也讲了一个类似的例子,有时间可以翻翻。

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

-END-

你可能感兴趣的:(c,内存管理)