C++ 如何使用munmap自定义malloc

C++ 如何使用munmap自定义malloc,c++,c,malloc,mmap,C++,C,Malloc,Mmap,我正在尝试重新编码malloc和free函数,但是我在munmap上遇到了一个问题 使用我的自定义malloc,我使用mmap(例如:4Kb)创建了一个内存池,因此当调用我的malloc时,我可以将这个内存池的索引作为地址返回 这很好,但是当我使用我的自定义自由(调用munmap)时,我想用自定义malloc分配其他东西,我得到了一个segfault,就像我的整个池被munmap拒绝分配一样 例如: Ask 1024 bytes to my malloc -> First call so

我正在尝试重新编码malloc和free函数,但是我在munmap上遇到了一个问题

使用我的自定义malloc,我使用mmap(例如:4Kb)创建了一个内存池,因此当调用我的malloc时,我可以将这个内存池的索引作为地址返回

这很好,但是当我使用我的自定义自由(调用munmap)时,我想用自定义malloc分配其他东西,我得到了一个segfault,就像我的整个池被munmap拒绝分配一样

例如:

Ask 1024 bytes to my malloc
-> First call so malloc allocate a pool of 4 * pagesize() (So 16 000     
bytes)
-> Return to me an addr than I use. (addr[0] = 42)
-> Free with munmap this address (munmap(addr, 1024))
-> re ask to my malloc 1024 bytes
-> Try to fill it with something and segfault.
我真的不明白发生了什么。munmap是否删除我的所有池


很抱歉英文很差。

您正在取消整个页面的映射

地址addr必须是页面大小的倍数包含指定范围一部分的所有页面均未映射,对这些页面的后续引用将生成SIGSEGV。如果指定的范围不包含任何映射页面,则不是错误


因此,当您
munmap
第一次分配时,您将取消映射整个第一页。只有在释放整个页面时,才应等待取消映射。。或者根本不取消映射-确保两个进程没有从同一页获取内存,因此没有安全漏洞。

因此,如果我向malloc请求两次1024,然后我想取消第一次,我不能,因为我的系统上有一个页是4096?我说得对吗?但是,所以,在这个案例中,我会有漏洞,在这个案例中,什么值得munmap的第二个论点?@JeanYim你是对的。第二个参数只有在大于
PAGE\u SIZE
时才有意义-一次可以取消映射多个页面。您将有碎片,但不超过4K,这并不坏。您将释放的1024字节保留在附近,以备下次进程请求时使用,非常感谢!最后一个问题,第二个参数是要取消映射的页数?不是要释放的八位字节数吗?(我相信)@JeanYim不,这是要释放的字节数,但它最终被四舍五入到最近的页面。所以,当你通过1024,结果是1页,但4200将是2页-就像你通过9192一样。好的,我明白了!非常感谢你!