C中的动态内存分配和释放(free)

 

C++ 集成 new 和 delete 操作进行动态内存分配,但是在 C 语言中无效

C 语言中使用函数库来解决,即在头<cstdlib>(在 C 中称为<stdlib.h>)中定义的函数:malloc ,calloc ,realloc ,free 。 

这些函数在 C++依然有效。但是使用上面函数分配的内存块和用 new 返回的并不一定兼容,不要混用,他们应当在各自的函数集或操作中使用。

 

 (1)   函数 malloc

  这个函数是给指针动态分配内存,原型:

 

  void* malloc (nbytes);

 

其中nbytes 是我们想要给指针分配的内存字节数。这个函数返回一个void*类型的指针,因此我们需要用类型转换(type cast)来把它转换成目标指针所需要的数据类型,例如:

 

  char* a;

  a = (char*)malloc (20);

 

这个例子将一个指向20个字节可用空间的指针赋给 a 。当我们想给一组除 char 以外的类型(不是1字节长度的)的数值分配内存的时候,我们需要用元素数乘以每个元素的长度来确定所需内存的大小。操作符 sizeof ,它可以返回一个具体数据类型的长度。

 

  int* b;

  b = (int*)malloc (10 * sizeof(int));

 

这一段代码将一个指向可存储10个 int 型整数的内存块的指针赋给 b ,它的实际长度可能是 2,4或更多字节数,这取决于程序是在什么操作系统下被编译的。

 

(2)   函数 calloc

  

  calloc 与 malloc 在操作上非常相似,他们主要的区别是在原型上:

 

  void* calloc (nelements, sizes);

 

 calloc 有两个参数,第一个 nelements 表示元素个数,第二个 sizes 表示 每个元素长度,这两个参数相乘被用来计算所需内存块的总长度。

如,我们可以这样定义上面的指针 b :

 

  int* b;

  b = (int*)calloc (2, sizeof(int));

 

malloc 和 calloc 的另一点不同在于 calloc 会将所有的元素初始化为0。

 

(3)   函数 realloc 

  它被用来改变已经被分配给一个指针的内存的长度

 

  void* realloc (void* pointer, nbytes);

 

参数 pointer 用来传递一个已经被分配内存的指针或一个空指针,而参数 nbytes 用来指明新的内存长度。这个函数给指针分配nbytes 字节的内存。这个函数可能需要改变内存块的地址以便能够分配足够的内存来满足新的长度要求。在这种情况下,指针当前所指的内存中的数据内容将会被拷贝到新的地址中,以保证现存数据不会丢失。函数返回新的指针地址。如果新的内存尺寸不能够被满足,函数将会返回一个空指针,但原来参数中的指针pointer 及其内容保持不变。

 

(4)   函数 free 

  这个函数用来释放被前面 malloc , calloc 或 realloc 所分配的内存块。

 

  void* free (void* pointer);

 

 pointer 用来传递一个要被释放的已分配内存的指针。

在这里要特别注意:这个函数只能被用来释放由函数malloc, callocrealloc所分配的空间。



posted on 2014-03-25 16:28  guozqzzu  阅读(700)  评论(0编辑  收藏  举报