C++动态内存创建与内存管理学习笔记[2]

2 C 中内存分配

A malloc原型为void* malloc(size_t size);在内存中的动态存储区中分配一个长度为size的空间,返回指向大小为size的内存区域首地址的void指针;用户必须决定对象的长度,即申请空间的大小。同时,malloc只是分配了一块返回值为void*的内存而不是生成一个对象。由于malloc返回值的类型是void*,所以在调用malloc时要显式地进行类型转换,将void* 转换成所需要的指针类型,malloc函数本身并不识别要申请的内存是什么类型,它只关心内存的总字节数,因此使用sizeof是很好的方式,例如:int* p = (int*) malloc(sizeof(int) * length);使用malloc所分配的是一块连续的内存,同时由于编译器的实现问题(比如边界对齐等),其所分配的内存可能比所请求的多一点。

如果内存池为空,或者可用内存不能满足所请求的内存,则编译器向操作系统请求,要求得到更多的内存,并在所得到的内存上执行分配任务。若操作系统无法向malloc提供更多的内存,那么malloc返回一个NULL指针,因此有必要对malloc的返回指针进行检查。

B realloc原型为void realloc(void* ptr, size_t sz);用于修改一个原先已经分配内存块的大小,可以扩大也可以缩小。若扩大时,则保留原先的内存,将新添加的内存放于原先内存块的后面,新内存并未以任何方式进行初始化;若缩小时,该内存块尾部的部分内存释放,其余部分保留。

注意:若realloc的第一个参数为NULL,那么其行为与malloc一样。另外如果原先的内存块无法改变大小,realloc将分配另一块正确大小的内存,并把原先那块内存的内容复制到新块上,因此在使用realloc之后就不能再使用指向原内存的指针,而应该改用realloc所返回的新指针。

C calloc原型为void* calloc(size_t elem_num, size_t elem_sz);malloc的主要区别在于calloc在返回指向内存的指针之前把它初始化为0,另一个区别是他们请求内存数量的方式不通,calloc的参数包括所需元素的数量和每个元素的字节数,由此它能够计算出总共需要分配的内存。

D free原型为void free( void* p ); 由于指针p的类型以及它所指的内存的容量事先都是知道的,因此语句free(p)能正确地释放内存。如果pNULL指针,那么freep无论操作多少次都不会出问题。如果p不是NULL指针,那么freep连续操作两次就会导致未定义的结果。

演示示例:(需要写出具有代表性的示例) 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值