有什麼辦法可以釋放使用malloc()創建的內存的某些部分;c中的動態內存分配,釋放使用malloc之前分配的內存的一部分()
假設: -
int *temp;
temp = (int *) malloc (10 * sizeof(int));
free(temp);
免費()將釋放的內存中的所有20個字節,但假設我只需要10個字節。我可以釋放最後10個字節嗎?
有什麼辦法可以釋放使用malloc()創建的內存的某些部分;c中的動態內存分配,釋放使用malloc之前分配的內存的一部分()
假設: -
int *temp;
temp = (int *) malloc (10 * sizeof(int));
free(temp);
免費()將釋放的內存中的所有20個字節,但假設我只需要10個字節。我可以釋放最後10個字節嗎?
您應該使用標準庫函數realloc
。顧名思義,它重新分配了一塊內存。其原型(包含在頭部stdlib.h
)
void *realloc(void *ptr, size_t size);
的函數改變所述存儲器塊的指向ptr
到size
字節大小。該內存塊必須由malloc
,realloc
或calloc
調用分配。需要注意的是,realloc
可能會將舊塊擴展爲size
字節,可能會保留相同的塊並釋放額外的字節,或者可能會分配一個全新的內存塊,將內容從較舊的塊複製到較新的塊,以及然後free
舊的塊。
realloc
返回一個指向重新分配的內存塊的指針。如果它不能重新分配內存,那麼它將返回NULL,並保持原始內存塊不變。因此,在調用realloc
之前,應將ptr
的值存儲在臨時變量中,否則原始內存塊將丟失並導致內存泄漏。此外,你應該不投的malloc
結果 - Do I cast the result of malloc?
// allocate memory for 10 integers
int *arr = malloc(10 * sizeof *arr);
// check arr for NULL in case malloc fails
// save the value of arr in temp in case
// realloc fails
int *temp = arr;
// realloc may keep the same block of memory
// and free the memory for the extra 5 elements
// or may allocate a new block for 5 elements,
// copy the first five elements from the older block to the
// newer block and then free the older block
arr = realloc(arr, 5 * sizeof *arr);
if(arr == NULL) {
// realloc failed
arr = temp;
}
清晰明瞭的解釋...謝謝兄弟 – Arjun
您可以使用標準c庫提供的realloc
函數。
C99標準7.20.3.4-1:本realloc函數:
的realloc函數將釋放舊的對象通過ptr指向和 指針返回到具有尺寸SPECI音響編一個新的對象按尺寸。新對象的內容應與釋放前的舊對象的內容相同,最大爲新舊對象的最小值。新對象中超出舊對象大小的任何字節都有不確定的值。
我認爲這是值得注意''realloc'不一定會釋放部分內存''malloc';它可能會選擇分配一個新塊,複製相關數據並釋放整個舊塊。 – sapi
@sapi:對。標準報價清楚地表明瞭這一點(*用粗體*標註) –
['realloc'(http://linux.die.net/man/3/realloc)是有這個目的 – GoldRoger