malloc,realloc,calloc和new分配内存

1.malloc
原型:extren void* malloc(size),在堆内存中分配size大小的内存空间并返回该分配内存空间的首地址;与new的主要区别在于new是一个关键字而malloc需要依赖于头文件,并且new可以自动计算所需内存大小并返回指定类型的指针int *p;p=new int [100];//计算100*sizeof(int)并返回为int*类型
int *p=(int*)malloc(100*sizeof(int)//计算大小并且转换为int*类型

动态内存分配的深入探究:系统实用mem_control_block结构管理已分配的内存块,struct mem_control_block
{ int _available;//标明1则为该块可用;
int size;//块的大小
}
malloc函数先将用户需要分配的字节加上mem_control_block结构大小得出的字节数是需要分配的实际大小,然后通过顺序遍历堆中的所有内存块,如果该内存块可用并且大于实际大小字节数,则返回该内存块的首地址并将其设置为0(不可用)否则继续遍历。如果没有找到内存块则调用sbrk()函数通过操作系统分配一块内存进行堆增长将其扩展在堆内,并返回其首地址。

2.calloc
原型eatern void* calloc(num_of_size,size),在堆内存中分配num_of_size个大小为size的内存空间并返回其首地址,与malloc函数不同的是calloc将内存空间初始为0,char类型为0(即NULL),若malloc分配的内存未被使用过也有可能为0,反之则为之前的遗留数据

3.realloc
原型extern void* realloc(*ptr,size),先判断ptr后堆内存是否有足够的大小分配size,有则继续分配,如果没有则找一块儿更大的内存分配size并将原来的数据复制到其中并返回其首地址;
关于realloc函数的注意事项:1.如果ptr=NULL,则相当于malloc()函数,返回分配的内存首地址;2.如果此时size=0,而ptr非NULL,这是realloc()会释放ptr指向的内存空间
void* ptr=realloc(ptr,0); //释放ptr并返回NULL
3.如果内存分配失败会返回NULL,凡是并没有释放ptr所指向的内存空间造成内存泄漏
void* ptr=realloc(ptr,size);
if(!ptr)
{...}//分配失败返回NULL,原ptr所指内容将会造成内存

4.free
free()函数将内存块设置为1(可用),供其他malloc函数分配,在调用了free()函数之后该内存块中的内容不会立即消失只是不在受到保护,因此有效的时间也是随机的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值