静态内存的数量在编译时是固定的,在程序运行期间也不会改变。自动变量使用的内存数量在程序运行期间自动增加或者减少。但是动态分配的内存数量只会增加,除非使用***free()***函数进行释放。例如,假设有一个创建数组临时副本的函数,其代码框架如下:
int main()
{
double glad[2000];
int i;
for(i = 0;i < 1000;i++)
{
gobble(glad,2000);
}
}
void gobble(double array[],int n)
{
double * temp = (double *) malloc(n * sizeof(double));
/*free(temp);*///假设忘记使用free()函数释放
}
第一次调用gobble()函数时候,他创建了指针temp;并且调用malloc()分配了16000字节的内存(假设double为8个字节)。假设代码如代码块所示,遗漏了free()函数,当函数结束时,作为自动变量的指针temp也会消失,但是他指向的16000个字节的内存却任然存在。由于temp指针已经被销毁了所以无法访问这块内存,他也不能被重复使用,因为代码块中没有调用free()释放这块内存。
第2次调用gobble()函数时候,他又创建了temp指针,并且调用malloc()函数分配了16000字节的内存。第一此分配的16000字节内存已经不能再使用,所以malloc()分配的另外一块16000字节的内存,当函数结束的时候,该内存块也无法被再次访问和使用。
循环要执行1000次,所以再循环结束时,内存池中有1600万字节被占用。实际上,也许在循环结束之前就已经耗尽了所有的内存。这类问题被称之为内存泄漏(memory leak)。在函数末尾处调用free()函数可以避免这类问题的发生。