2011-09-11 44 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'新的匿名頁面代替您移動的頁面。 –