实际的malloc是这么工作的 维护一个自由内存块组成的链表 当申请时需要查找合 适大小的(为了减少碎片 常把不同大小的块放在不同的池中) 解链 返回指针 剩 余的自由内存回链 free的时候只需要一个指针就能查到这一块的大小 从而释放内 存 这样得到的指针比如在32位系统只能保证32位对齐
那个考题 因为需要分配大对齐的块 那么分配的时候要多一些 前面不对齐的 reserve下来 将对齐的指针返回调用者 但是释放的时候从这个指针无法直接释放 所以需要通过一个简单的索引 得到malloc时拿到的指针 对这个指针free 才可以 完成操作
Void * mymalloc(int size) { unsigned char * p = (unsigned char *)malloc(size + n); unsigned char * q = (p + n) & (~(n - 1)); *(q - 1) = q - p; return q; } void myfree(void * p) { unsigned char * q = p; free(q - *(q-1)); } 在 2010-8-9,上午8:57,徐学锋 <xuefengxu.hust@xxxxxxxxx> 写到:
你说的这个基本是实际内存分配原理,但好像不完全一样,实际内存也是用一个 结构表示分配区域,偏移、大小、起始地址,不过很容易产生碎片在 2010年8月8日 上午10:46,Fiore Zhang <fiorezhang@xxxxxxxxx>写道: 主要是free的时候如何不内存泄露,所以关键是分配size +n然后取整的长度,这样的话,能保证在malloc返回的指针前面,留至少一个字 节的空,在这里写入malloc返回的指针在实际申请的内存里的偏移,然后free的 时候根据指针,往前推一个字节查到偏移,就能知道实际上在内存里申请的内存 的头在哪里,然后在那里释放内存,可以保证不泄露。是这样不?细节可以再完 善。在 2010年8月7日 上午8:53,徐学锋 <xuefengxu.hust@xxxxxxxxx> 写道:> malloc/free 要调用系统调用还是直接在内存地址上操作,关键是内存管理算 法不是malloc/free,如果就写个malloc/free> 倒是没啥吧 > > 在 2010年8月6日 下午4:26,figo zhang <figo1802@xxxxxxxxx>写道: >> >> 忽悠想起一道N年前去xx>> interview的是被考的一个题目,要求当场在白板上写出来,当时虽然写了, 感觉不太好,后来回去的路上在地铁上想出来比较好的方法,日!>> 拿出来给大家分享一下。 >>>> 请用malloc()/free()重新写一对分配函数,要求分配的内存地址以n个字节 对齐,比如n是32.>> >> >> 那位想到了,回复一下吧 > >