C 语言中的 maclloc free()
在几乎所有的情况下, C 语言都可以自动的来分配内存,这不需要你的参与。这很高效,也很安全。这也是目前主流语言所采取的策略。但是 C 语言除了系统自动分配和回收内存,还可以自己手动来分配和回收内存,让你的程序更具有灵活性。
1. 动态分配内存
int \*x;
x = (int \*)maclloc(32);
maclloc
函数的参数是分配的内存的大小,这个值我们也可以根据不同变量类型通过 sizeof
这个函数来获得。其返回值是一个无类型的指针。所以这里我们用了显示的类型转换,将其转换与指针变量类型相同的指针。
2. 回收动态分配的内存
回收动态分配的内存需要传入指针变量即可。
free(x);
这样就释放了我们之前动态分配的内存空间。
3. 示例程序
#include <stdio.h>
#include <stdlib.h>
int main()
{
int \*x;
printf("x value: %p, x address: %p, \*x value: %d\n", x, &x, \*x);
x = (int \*)malloc(sizeof(x));
printf("x value: %p, x address: %p, \*x value: %d\n", x, &x, \*x);
\*x = 10;
printf("x value: %p, x address: %p, \*x value: %d\n", x, &x, \*x);
free(x);
return 0;
}
运行结果:
x value: 0x7fffeac6bd50, x address: 0x7fffeac6bc60, *x value: 1
x value: 0x7fffe3916270, x address: 0x7fffeac6bc60, *x value: 0
x value: 0x7fffe3916270, x address: 0x7fffeac6bc60, *x value: 10
程序中声明了一个整数型的指针,然后对这个指针分配了一块内存。把这个分配好的内存地址给了指针变量。然后对这个地址所表示的变量进行赋值。最后再回收分配的内存。
4. 小结
动态内存分配可以说是 C 语言程序员的噩梦。我们可能会遇到如果分配了内存,但是在最后没有回收内存。这种情况就如同内存空洞存在,会不断的使系统的可用内存减少,因此称之为内存泄露。这是非常常见的内存分配的错误。很多著名的软件也都会存在这种问题。最简单的解决办法就是通过定期重启程序来解决。还有一种常见错误就是使用没有成功分配的内存地址。这也会引起莫名的错误。
同时使用分配内存的函数会消耗一定的资源,因为这会让 C 语言调用与系统之间的 API ,会拖慢程序的运行。大量的调用会产生性能问题。
所以在进行涉及计算机或者其他设备硬件资源操作的时候,一定要谨慎。因为这些资源是有限的,一旦被占用了,可利用的资源数量就会减少。直至资源的耗尽。