2015-10-15 16 views
1

我在我的bsm_create函數的不同位置調用了malloc函數,但在某些地方我得到了相同的內存地址。 malloc/calloc函數可以釋放某個位置並在linux(fedora)環境中再次分配該位置。當malloc函數分配相同的內存位置?

+6

地址釋放後,可以重新使用。爲什麼不? – Klaus

+0

你爲什麼用「valgrind」標記你的問題?你認爲再次返回相同地址的'malloc'會對Valgrind造成問題嗎?它不會,因爲Valgrind用它自己的實現替換了'malloc',跟蹤當前分配的內容。 – 5gon12eder

回答

4

當先前malloc()(或其家庭)分配的緩衝區已經發布了free()(或間接地在realloc()呼叫釋放),它會被重用 - 這意味着你可以期望它在未來的分配返回。這就是你首先想要free()的原因。

0

您沒有明確指出是否釋放了它們。正如其他人所說的,一個釋放的內存區域可以被重用,但是如果仍然被分配的話,你當然不會得到相同的地址。

但是,如果您重新分配(realloc()和家庭)更高的大小它可以移動到其他地方,所以最初的地址可以/可以稍後重用,即使沒有釋放任何東西。

實施例:分配32 *的sizeof(int)的兩倍給出地址:0xeee010 0xeee0a0

重新分配所述第一一個64 *的sizeof(int)的引線到一個新的地址:0xeee130

然後分配一個其它32 *的sizeof(int)的1號地址掉落:0xeee010

+0

OP明確指出內存已被釋放,儘管英文有點破碎:_Can malloc/calloc函數釋放了一些位置,並再次分配該位置_ – mah

1
  • 當malloc函數分配同一存儲器位置?
    • 當您調用malloc函數時,您正在請求在堆中留出一些空間。如果請求的空間存在,malloc會給出分配空間的起始地址。我們稱之爲AA是分配空間的起始地址。
    • 當我們在這個分配的空間上調用free時,我們正在請求釋放,所以現在這個返回的空間可以被運行時自由使用。因此,從位置A開始分配字節的內存將被釋放並返回到運行時。
    • 所以,當有人問再次一些空間,有很大的可能性 (和概率!= 0),其起始地址從一些字節一個仍然是免費的,所以運行時可以給一個再次回來。

希望它有幫助!