[linux_interest_group] Re: [linux_interest_group] Re: [linux_interest_group] Re: [linux_interest_group] Re: [linux_interest_group] 一道有趣的题目

  • From: Fiore Zhang <fiorezhang@xxxxxxxxx>
  • To: "linux_interest_group@xxxxxxxxxxxxx" <linux_interest_group@xxxxxxxxxxxxx>
  • Date: Mon, 9 Aug 2010 21:16:06 +0800

实际的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.
>>
>>
>> 那位想到了,回复一下吧
>
>

Other related posts:

  • » [linux_interest_group] Re: [linux_interest_group] Re: [linux_interest_group] Re: [linux_interest_group] Re: [linux_interest_group] 一道有趣的题目 - Fiore Zhang