我正在學習如何編寫C函數來接受一個數組並返回一個修改後的數組。如果你不在一個函數中釋放動態分配的內存會發生什麼?
在功能testfunc
(這是應該簡單地添加到10
輸入數組b
的每個元素)我使用malloc
npts
數目的整數的分配存儲器。但是因爲我想使用指針返回這個數組,所以我並沒有在函數結尾釋放這個內存。假設我調用這個函數100
次,就像我在代碼中做的那樣,所以在代碼中分配的所有內存會發生什麼?代碼100*10*4
字節使用的內存量是多少?對於不適用於動態內存分配的函數,我認爲當函數返回最終值並且再次調用它時,分配給變量的內存會消失,然後再次分配內存等等。但我對這種情況會發生什麼感到困惑。
我不能釋放函數內分配的內存,因爲我需要它將數組返回到主函數,但我也需要爲不同的數組調用此函數超過100次,所以如果它繼續分配和再次,它會用完內存
有沒有辦法來檢查代碼使用多少內存? (除了在Mac-OSX上查看Activity Monitor)。
謝謝!
/* code to test returning array from functions */
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int* testfunc(int *a,int npts);
int main(int argc, char* argv[])
{
int *b;
int a[10],i,j,npts=10;
b=(int *) malloc(sizeof(int)*npts);
for (j=0; j <100; j++)
{
printf("iteration number %d \n",j);
for (i=0; i<npts; i++)
{
a[i]=i;
printf("%d \n",a[i]);
}
b=testfunc(a,npts);
printf("returned array \n");
for (i=0; i<npts; i++)
{
printf("%d \n",b[i]);
}
}
printf("the size of one integer is %d \n",sizeof(int));
return 0;
}
int* testfunc(int *b,int npts)
{
int *c;
int i=0;
c=(int *) malloc(sizeof(int)*npts);
for (i=0; i<npts; i++)
{
c[i]=b[i]+10;
}
return c;
}
這是可能的解決方案,以避免在函數內部分配存儲器和能夠調用函數多次
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void testfunc(int *c,int *d,int npts);
int main(int argc, char* argv[])
{
int *a,*b;
int i,j,npts=10;
a=malloc(sizeof(int)*npts);
b=malloc(sizeof(int)*npts);
for (j=0; j <100; j++)
{
printf("iteration number %d \n",j);
for (i=0; i<npts; i++)
{
a[i]=i;
printf("%d \n",a[i]);
}
testfunc(a,b,npts);
printf("returned array \n");
for (i=0; i<npts; i++)
{
printf("%d \n",b[i]);
}
}
printf("the size of one integer is %d \n",sizeof(int));
free(a);
free(b);
return 0;
}
void testfunc(int *c,int *d,int npts)
{
int i=0;
for (i=0; i<npts; i++)
{
d[i]=c[i]+10;
}
}
所以在該代碼中,有100內存泄漏和所有內存分配,但我無法訪問它,因此它被浪費? – Guddu
@Guddu:是的,儘管當進程退出時它會自動放開。這實際上並沒有保證這個標準,但是我從來沒有見過一個讓程序退出後馬特內存掛起的實現。 – paxdiablo
也關於你的回答'這回傳了內存和管理它的責任',所以如果我在主函數中釋放'b',它會自動釋放'c'嗎? – Guddu