`
xitonga
  • 浏览: 586063 次
文章分类
社区版块
存档分类
最新评论

学习之第一周小结 malloc、calloc、realloc、free、new、delete函数应用

 
阅读更多

学习之第一周小结 malloc、calloc、realloc、free、new、delete函数应用
malloc()、free()、calloc()、realloc()、在头文件stdlib.h中,new和delete在C++的头文件iostream中
1、malloc()
原型:void *malloc(size_t size);
malloc的参数是需要分配的内存字节数。如果内存池中的可用内存可以满足这个需求,maollc就返回一个指

向被分配的内存块起始位置的指针(指针类型为void *)。如果,操作系统无法向malloc提供足够内存,malloc就返

回一个NULL指针。因此每个从malloc返回的指针都要进行检查,确保它并非NULL。
例如:int *p;
if((p=(int *)malloc(100))==NULL){printf("out of memory !");exit(1)}
//表示如果malloc成功从内存获取100个字节的连续空间,并将内存空间起始地址给p;否则将返回NULL并赋值给p;

2、calloc()
原型: void *calloc( size_t num_elements, size_t element_size);
calloc也用于分配内存。calloc的参数包括所需元素的数量和每个元素的字节数。除参数设置于malloc不同

外,calloc在分配内存时会自动将存储空间置初值0;
例如: int *p;
if((p=(int *)calloc(4,10))==NULL){printf("out of memory !");exit(1)}
//表示如果calloc成功从内存获取4*10个字节的连续空间并值初值0,则将起始地址给p;否则将返回NULL并赋值给p;

3、realloc()
原型:void realloc( void *ptr,size_t new_size)
realloc函数用于修改一个原先已经分配的内存的大小。第一个参数为需要改变内存大小的指针名,第二个参

数为新分配内存的大小。
使用这个函数,你可以使一块内存扩大或缩小。如果它用于扩大一个内存块,那么这块内存原先的内容依然

保留,新增的内存添加大原先内存块的后面。如果用于缩小一个内存块,该内存尾部的部分内存便被拿掉,剩余部分

内存的原先内容依然保留。
如果原先的内存块无法改变大小,realloc将分配另一块正确大小的内存,并把原先那块内存的内容复制到新

的块上。因此,在使用realloc之后,就不能再使用旧内存的指针,而是应该使用realloc所返回的新指针。 realloc

失败的时候,返回NULL。
若realloc的一个参数为NULL,那么他的行为就和malloc一样。若第二个参数为0,则效果等同于free()。

4、free()
原型:void free(void *ptr)
free函数用于释放内存。参数表示malloc、calloc、realloc返回的地址。若参数等于NULL,则free不会产生

任何效果。free函数无返回值。


5、new()
C++中动态内存创建new分为两个步骤:在堆里为对象分配内存(C++中的operator new具有内置的长度计算,

类型转换与安全检查);如果内存分配成功,则为该内存调用合适的构造函数进行初始化。new 实际上总以标准C中的

malloc()完成。
例如:int *q = new int;
int *r = new int(888);//申请内存放入888


6、同时delete operator也是以标准C中的free()完成。
delete operator也相应地分为两步:调用相应类的析构函数;释放内存。
例如:int *r = new int(888);
delete r;
使用原则:(1)不要用delete来释放不是new分配的内存
(2)不要使用new来释放同一内存两次
(3)如果在new表达式中使用[],必须在相应的delete表达式中也使用[]。如果在new[]表达式中不使用[],

一定不要在相应的delete表达式中使用[]。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics