简单说,Handle就是指针的指针。
在c语言里面,假如你通过malloc申请一段内存空间,heap给你一个指针直接指到你可用内存的起始位置。在你释放之前操作系统无法将这段内存移动。
至于为啥要移动,因为你在程序各处调用大小不一的malloc会产生内存碎片。碎片多了总之不好,最好把碎片移到一块,这样就又有大块的内存空间可以malloc了。这个过程叫defragmentation。跟windows上硬盘碎片整理一样。
malloc直接给你指针的话就不方便heap管理内存。因为只要你不free,它就不敢动那块内存。但是假如给你指针的指针,增加一次跳转。动态内存管理内部维护一个表,第一次对指针dereference进入这个表,再来一次才到你可用的内存块。这样动态内存管理就可以把真正的那段内存定期合并起来,然后只要调整那个表指向新的地址。