2011-09-11 41 views
3

mremap和malloc一起工作吗?

void * mremap(void *old_address, size_t old_size , size_t new_size, unsigned long flags); 

与兼容的malloc()?

GCC(C++)和使用Linux。

谢谢。

回答

6

不,它不是。除了malloc不需要在页面边框给你一个地址(这是mremap预计的地址),如果知道你已经做了malloc而没有malloc的内存映射,那将是危险的。改为使用realloc

+0

附加说明:如果可能,GLIBC的realloc在Linux上使用'mremap'。 – Mat

+0

大多数情况下,'mremap'的唯一目的是实现'realloc' ... –

2

不,但很有可能它会工作,如果您以前的mableced内存页面对齐。当然,当malloc相关的调用发现你已经移动了他们的数据的时候,它们会变得很烦。结果可能包括堆失效,数据损坏和分段错误。

+0

不,实际上使用通用的实现方式,当内存页面对齐时,mremap'正确工作的概率(不会严重破坏malloc状态)是**零**。唯一的办法是'malloc'永远不会返回页面对齐的内存,如果它不是**,则使用'mmap'作为底层机制,即只使用'brk'。这是因为在malloc返回的块之前需要几个字节的簿记信息,抵消了由“mmap”获得的页面对齐地址。 –

+0

当然,如果你只是通过'malloc'实际分配给你的范围的一个子范围,那么它可能总是可以的,只要你(1)永远不释放它,或者(2)'mmap'新的匿名页面代替您移动的页面。 –