[英]free allocated memory of array (vs normal var?)
我知道當我們為var分配內存時,我們需要通過使用指向var的指針調用free()func來釋放空間(而不是讓指針懸空)。
但是,當我們為變量數組分配內存時,我們該怎么辦? 我們應該去釋放數組[0..n]的每個成員,還是僅僅為第一個成員釋放指針?
long *array_p;
size_t elements_num = 5
array_p = malloc(elements_num*sizeof(long));
選項1:
free(array_p);
array_p=NULL;
選項#2:
for (i=0; i<array_len-1; ++i)
{
free(array_p+i);
array_p+i= NULL;
}
問題不在於您是否正在分配數組,而是在分配指針數組。
你需要為你使用的每個malloc
/ calloc
free
。 現在在這種情況下
int* array = calloc(10, sizeof(int));
你在內存中有一個連續10塊的int
,你需要一個free(array)
。
但你可以有一個
int** arrayOfArray = calloc(10, sizeof(int*));
現在你有一個10 int*
的數組,所以指向int
。 在實際情況下,您的數組無法使用,您必須分配或分配數組的每個元素,例如:
for (int i = 0; i < 10; ++i)
arrayOfArray[i] = calloc(5, sizeof(int));
因此,第一個數組的每個元素都是一個指針,指向5 int
的連續內存塊。 在這種情況下,您有兩個級別的分配,實際上您需要兩個級別的解除分配,順序相反,例如:
for (int i = 0; i < 10; ++i)
free(arrayOfArray[i]);
free(arrayOfArray);
操作系統通常以這種方式工作:每個內存分配在內存塊中留下痕跡 - 除了您的實際/實際數據大小(其中包括一些附加信息,如分配的內存長度,下一個可用的內存地址)分配等)。 再具體一點,
當你分配一個40個字符的塊時,操作系統將分配56個字節-16個字節,以便跟蹤分配的內存長度,下一個可用(空閑)內存地址等,以及實際數據的40個字節。
當你分配一個40個整數的塊時,這次,操作系統將分配176個字節 - 相應的,16個字節,以便跟蹤分配的內存長度,下一個可用(空閑)內存地址等等(和4×40 =)160字節為您的實際數據。
因此,當您釋放數據數組時,操作系統將已經知道要釋放的內存的起始和結束地址。
本視頻的前20分鍾非常詳細地解釋了該過程。
但是當我們為變量數組分配內存時,我們該怎么辦? 我們應該去釋放陣列的每個成員[0..n],
是的,你必須free()
數組中分配的每個指針。
或者只是釋放第一個成員的指針?
沒有。
例如,
char *p[50];
for(i = 0; i<50;i++)
p[i] = malloc(10);
for(i = 0; i<50;i++)
free(p[i]);
char **p;
p = malloc(50 * sizeof(char*));
for(i = 0; i<50;i++)
p[i] = malloc(10);
for(i = 0; i<50;i++)
free(p[i]);
free(p);
基本上,對於malloc()
每次調用,你都有一個對free()
調用。
在創建變量數組時,了解您正在創建的內容非常重要。 在C中,指針的作用類似於數組,因此您需要遍歷整個數組,釋放每個成員,然后釋放第一個成員的指針。 簡單地將點釋放到第一個成員而不釋放數組的每個成員通常會導致內存泄漏,這最終可能導致程序運行緩慢並最終崩潰或修改/訪問您不打算修改的數據(分段錯誤) )。
你只需將指針傳遞給第一個元素(這是malloc給你的東西)來釋放:
int * array = malloc(10 * sizeof(int));
....
free(array);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.