关于malloc、free、new、delete以及calloc、realloc基本库函数与运载符的含义

在求职的笔试中,发现对malloc、free、new、delete的考察很多,同时也考到了没见过的calloc、realloc库函数,因此还是把这些知识点记录下来,以后方便查阅。

一、malloc和free

malloc和free都是c语言的库函数,一般在stdlib.h中,主要用来进行一段动态内存的分配,包括申请和释放。

malloc的函数原型为Void *malloc(size_t size),主要用于从堆上进行一段内存的申请,返回无类型的指针,需要将返回的指针转换为数据的类型,同时对申请的数据不进行初始化。

free用于将一段指针所指向的内存进行释放,free(p);由于通过malloc申请的内存在系统中记录了长度,因此不需要传入内存的长度。

 

二、malloc、calloc和realloc的比较

malloc的功能如上所述,calloc是用来进行堆空间的内存申请, 函数原型为void *calloc(size_t numElements,size_t sizeOfElement);参数为申请内存元数的个数,以及类型的长度,因此不必计算所要分配的内存的总字节数,同时alloc会对申请的内存进行初始化为0;

malloc和calloc所申请的内存均位于堆空间。malloc由于不需要对所申请的内存进行初始化,因此比calloc的效率要高。

realloc相当于改变指向动态内存区的指针的指向,让它指向新的动态内存地址;函数原型为extern void *realloc(void *mem_address, unsigned int newsize);一般分配了内存之后,如果重新分配内存,当之前分配的内存够用时指针不变,但要分配更大的内存空间时,采用尾部扩展的方式和新开辟一块内存(数据移动了),并返回内存首地址的指针。

 

三、new、delete

new、delete为c++中的库函数,可以用来进行创建对象、分类内存,属于运算符,因此相比malloc能够调用对象的构造函数进行对象内存的申请,可以对非库中的对象进行内存的分类,而malloc则只能针对库中的标准对象进行内存的申请,函数原型为void *operator new(size_t);和void *operator new[](size_t);第二个用于创建数组;

delete用于将new的内存释放,函数原型为void *operator delete(void *),会调用对象的析构函数,释放指针对应的内存,而创建的数组类型则用 *operator delete[](void *)删除。即delete []p;

一般上述的内存分配方式,在进行内存释放时,调用free和delete删除指针p所指向的内存区域之后,最好将p=null,因为此时p属于野指针了,如果后面调用会产生不可预知的错误。


参考:

百度百科


 

 

 

 

 

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值