内存池C语言的内存管理,从来都是一个让人头秃的问题。要想更自由地管理内存,就必须去堆中申请,然后还需要考虑何时释放,万一释放不当,或者没有及时释放,造成的后果都是难以估量的。 当然如果就这些,那倒也还不算什么。问题就在于,如果大量地使用malloc和free函数来申请内存,首先使要经历一个从应用层切入系统内核层,调用完成之后,再返回应用层的一系列步骤,实际上使非常浪费时间的。更重要的是,还会产生大量的内存碎片。比如,先申请了一个1KB的空间,紧接着又申请了一个8KB的空间。而后,这个1KB使用完了,被释放,但是这个空间却只有等到下一次有刚好1KB的空间申请,才能够被重新调用。这么一来,极限情况下,整个堆有可能被弄得支离破碎,最终导致大量内存浪费。 那么这种情况下,我们解决这类问题的思路,就是创建一个内存池。 内存池,实际上就是我们让程序创建出来的一块额外的缓存区域,如果有需要释放内存,先不必使用free函数,如果内存池有空,那么直接放入内存池。同样的道理,下一次程序申请空间的时候,先检查下内存池里面有没有合适的内存,如果有,则直接拿出来调用,如果没有,那么再使用malloc。 其实内存池我们就可以使用单链表来进行维护,下面通过一个通讯录的程序来说明内存池的运用。 普通的版本: 运行结果如下: - //Consequence 04 V1
- | 欢迎使用通讯录管理程序 |
- |--- 1:插入新的联系人 ---|
- |--- 2:查找现有联系人 ---|
- |--- 3:更改现有联系人 ---|
- |--- 4:删除现有联系人 ---|
- |--- 5:显示当前通讯录 ---|
- |--- 6:退出通讯录程序 ---|
- 请输入指令代码:1
- 请输入姓名:HarrisWilde
- 请输入电话:0101111
- 请输入指令代码:1
- 请输入姓名:Jack
- 请输入电话:0101112
- 请输入指令代码:1
- 请输入姓名:Rose
- 请输入电话:0101113
- 请输入指令代码:2
- 请输入联系人:HarrisWilde
- 联系人:HarrisWilde
- 电话:0101111
- 请输入指令代码:2
- 请输入联系人:Mike
- 找不到该联系人!
- 请输入指令代码:5
- 联系人:Rose
- 电话:0101113
- 联系人:Jack
- 电话:0101112
- 联系人:HarrisWilde
- 电话:0101111
- 请输入指令代码:3
- 请输入联系人:HarrisWilde
- 请输入联系电话:0101234
- 请输入指令代码:5
- 联系人:Rose
- 电话:0101113
- 联系人:Jack
- 电话:0101112
- 联系人:HarrisWilde
- 电话:0101234
- 请输入指令代码:6
下面加入内存池:
|