C语言动态内存分配
1、new操作符和malloc函数
C++中的new操作符会隐式的考虑到分配的数据类型(与delete配合使用),表达式实例(以int类型为例)
new int[4]
void* malloc(unsigned size)
表达式实例
malloc(4*sizeof(int))
拓展总结
特征 | new/delete | malloc/free |
---|---|---|
分配内存的位置 | 自由存储区 | 堆 |
内存分配成功的返回值 | 完整类型指针 | void* |
内存分配失败的返回值 | 默认抛出异常 | 返回NULL |
分配内存的大小 | 由编译器根据类型计算得出 | 必须显式指定字节数 |
处理数组 | 有处理数组的new版本new[] | 需要用户计算数组的大小后进行内存分配 |
已分配内存的扩充 | 无法直观地处理 | 使用realloc简单完成 |
是否相互调用 | 可以,看具体的operator new/delete实现 | 不可调用new |
分配内存时内存不足 | 客户能够指定处理函数或重新制定分配器 | 无法通过用户代码进行处理 |
函数重载 | 允许 | 不允许 |
构造函数与析构函数 | 调用 | 不调用 |
2、calloc函数
calloc函数与malloc函数的主要差别是函数原型不同,calloc函数原型为
void* calloc(unsigned nitems, unsigned size)
其功能是分配nitems个连续的内存块,每块字节数为size。由于calloc函数实质上是分配nitems*size个字节的连续内存块,因此,calloc(nitems, size)与malloc(nitems*size)功能上等同。不同于malloc函数,处理细节上,calloc函数将所分配的内存块清零。
3、realloc函数
函数原型
void* realloc(void *block, unsigned size)
用于动态申请内存后,空间的大小调整,该函数将释放和重新分配内存块在一次调用中完成,参数block是被释放的内存块的起始地址,参数size说明新申请的字节数,细节上,函数先判断是否可在原申请的内存空间上拓展成符合重新分配要求的新空间,若可,则执行;否则,函数在堆区中寻找符合重新分配大小的空间,若找到,则拷贝原空间存储信息的位模式到新空间,返回向该内存块起始字节的指针释放原空间,如果未找到符合要求的空间,realloc返回NULL不释放原空间。