C语言
malloc函数:申请堆区空间,并返回一个指向它的指针。
原型:void *malloc(size_t size)
参数:size_t 是一些C/C++标准在stddef.h中定义的,size_t 类型表示C中任何对象所能达到的最大长度,它是无符号整数。size 是需要申请的内存块大小,以字节为单位。
返回值:申请成功返回指向已分配内存的指针,申请失败返回NULL。
用法:
char *str; |
/*申请堆区空间*/ |
str = (char *)malloc(20); |
if(NULL == str) |
{ printf("申请失败"); } |
calloc函数:申请堆区空间,返回申请空间的地址,并将每个字节初始化为0。
原型:void *calloc(size_t num,size_t size)
参数:num为元素个数,size为元素大小。
返回值:申请成功返回指向已分配内存的指针,申请失败返回NULL。
用法:
int *p ; |
/*申请堆区空间*/ |
p = (int *)calloc(10,sizeof(int)); |
if(NULL == p) |
{ printf("申请失败") } |
free函数:释放指针指向的堆区空间
原型:void free(void *memblock)
参数:memblock指针指向的内存
返回值:空
用法:
free(str); |
free(p); |
C++
申请1个int类型空间并且释放
int *p = new int; //申请一个int大小的空间 |
delete p; //释放空间 |
int *p = new int(10);//申请1个int大小的空间并初始化为10; |
delete p; //释放空间 |
申请10个int类型的空间并释放
int *p = new int[10];//申请10个int类型的空间 |
delete p; //释放空间 |
区别:
申请的内存所在位置
new操作符从自由存储区(free store)上为对象动态分配内存空间,而malloc函数从堆上动态分配内存。自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请,该内存即为自由存储区。而堆是操作系统中的术语,是操作系统所维护的一块特殊内存,用于程序的内存动态分配,C语言使用malloc从堆上分配内存,使用free释放已分配的对应内存。
那么自由存储区是否能够是堆(问题等价于new是否能在堆上动态分配内存),这取决于operator new 的实现细节。自由存储区不仅可以是堆,还可以是静态存储区,这都看operator new在哪里为对象分配内存。
返回类型安全性
new操作符内存分配成功时,返回的是对象类型的指针,类型严格与对象匹配,无须进行类型转换,故new是符合类型安全性的操作符。而malloc内存分配成功则是返回void * ,需要通过强制类型转换将void*指针转换成我们需要的类型。
内存分配失败时的返回值
new内存分配失败时,会抛出bac_alloc异常,它不会返回NULL;malloc分配内存失败时返回NULL。
使用new操作符来分配对象内存时会经历三个步骤:
- 第一步:调用operator new 函数(对于数组是operator new[])分配一块足够大的,原始的,未命名的内存空间以便存储特定类型的对象。
- 第二步:编译器运行相应的构造函数以构造对象,并为其传入初值。
- 第三部:对象构造完成后,返回一个指向该对象的指针。
使用delete操作符来释放对象内存时会经历两个步骤:
- 第一步:调用对象的析构函数。
- 第二步:编译器调用operator delete(或operator delete[])函数释放内存空间。
mealloc不会调用构造函数,free也不会调用析构函数