malloc、calloc、new的区别

这几个都是动态申请空间用到的关键字。

malloc定义:百度百科

calloc定义:百度百科

new定义:百度百科 、博客园FutureNow这个人整理的挺好的。

malloc和calloc的区别:

calloc在动态分配完内存后,自动初始化该内存空间为零,而 malloc不做初始化,分配到的空间中的数据是随机数据。其中malloc的简介如下:
  • 原型:extern void* malloc(unsigned int size);  [1] 
  • 功能:动态分配内存;
  • 注意:size仅仅为申请内存字节大小, 与申请内存块中存储的数据类型无关,故编程时建议通过以下方式给出,"长度 * sizeof(数据类型)" [2]

calloc的用法:

void *calloc(size_t nmenb, size_t size);
calloc()函数为nmemb个元素的数组分配内存空间,其中,每个元素的长度都是size个字节。如果要求的空间无效,那么此函数返回 指针。在分配了内存之后,calloc()函数会通过将所有位设置为0的方式进行初始化。比如,调用calloc()函数为n个整数的数组分配存储空间,且保证所有整数初始化为0:
pi = calloc(n, sizeof(int));
因为calloc()函数会清空分配的内存,而malloc()函数不会,所以可以调用以“1”作为第一个实参的calloc()函数,为任何类型的数据项分配空间。比如:
struct point{ int x, y;} *pi;
pi = calloc(1, sizeof(struct point));
在执行此语句后,pi将指向一个结构体,且此 结构体的成员x和y都会被设为0。
一般使用后要使用  free(起始地址的指针) 对内存进行释放,不然内存申请过多会影响计算机的性能,以至于得重启电脑。如果使用过后不清零,还可以使用该指针对该块内存进行访问。
头文件: stdlib.hmalloc.h  [1]

以上两个进行动态分配的空间,用完了之后需要人为的进行动态的释放。

通常是使用free函数进行内存的释放。或者使用realloc进行内存的释放,realloc也可以对使用的内存进行修改。

free的使用注意事项:free函数与malloc()函数配对使用,malloc函数释放申请的动态内存。对于free(p)这句语句,如果p 是NULL 指针,那么free 对p 无论操作多少次都不会出问题。如果p 不是NULL 指针,那么free 对p连续操作两次就会导致程序运行错误。

附带青儿哥哥关于free的使用注意事项的讲解链接

下面有realloc函数的使用方式:

#include<malloc.h>
voidmain()
{
char*p,*q;
p=(char*)malloc(10);
q=p;
p=(char*)realloc(q,20);//A行,通过realloc扩大p的空间,并把新的地址赋值给p。
//…………………………
}

free是和malloc、realloc、calloc函数成对出现的,来保证动态分配的空间及时释放。

在分配内存的时候用的是new,在释放的时候就需要使用delete/delete[];

malloc和new的区别:

new的具体使用方式如下:

类型 *变量名 = new 类型;

delete 变量 / delete[] 变量;

类型包括数组、结构体和类等等。

C++中new可以动态分配内存,这和C语言中malloc的作用类似。但不同的是new创建类的时侯会自动调用构造函数,而malloc则不会。

 因此C++中一般使用new来进行动态分配内存,与malloc一样用new分配的内存可以需要释放,但并不是使用free来释放,而是使用delete来释放。同样delete会自动调用析构函数,而free则不会。

 new 返回指定类型的指针,并且可以自动计算所需要大小。而 malloc 则必须要由我们计算字节数,并且在返回后强行转换为实际类型的指针

除了分配以及最后释放的方式不一样之外,通过malloc或new得到的指针,在其它操作上保持一致。

猜你喜欢

转载自www.cnblogs.com/littleswan/p/12473160.html