mremap能够与malloc一起使用吗?

3

Is

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

与malloc()兼容吗?

使用GCC(C++)和Linux。

谢谢。

2个回答

7
不,不是。除了malloc不需要在页面边界处提供地址(这就是mremap期望的),在没有让malloc知道你所做的情况下,擅自更改内存映射是非常危险的。使用realloc代替。

附加说明:在Linux上,GLIBC的realloc在可能的情况下使用mremap。 - Mat

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

不,实际上在常见的实现中,当内存页对齐时,mremap 正确工作(不会严重破坏 malloc 状态)的概率是 malloc 返回页对齐内存的唯一方法是如果它没有使用 mmap 作为底层机制,即只使用 brk。这是因为在 malloc 返回的块之前需要一些字节的簿记信息,抵消了通过 mmap 获得的页对齐地址。 - R.. GitHub STOP HELPING ICE
当然,如果您只是mremap实际由malloc分配给您的范围的子范围,并且要么(1)从不释放它,要么(2)在移动的页面位置上mmap新的匿名页面,则可能总是可以。 - R.. GitHub STOP HELPING ICE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接