重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
new 和 malloc都可以用来动态分配内存,那么什么c++要都此一举的增加一个新的运算符呢?原因是在实例化类时,要调用类中的构造函数,传统的malloc函数无法完成这样的功能,所以只能新增运算符
陆丰ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为创新互联的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:028-86922220(备注:SSL证书合作)期待与您的合作!
相同点:都会分配内存
不同点:
(1)如果构造函数和析构函数,则new和delete会分别调用构造函数和析构函数,malloc和free则不会
(2)malloc和free是函数,而new和delete是运算符
c语言中malloc函数和realloc函数的区别为:分配不同、释放不同、强制转化不同。
一、分配不同
1、malloc函数:malloc函数对没有分配过的内存块直接进行分配。
2、realloc函数:realloc函数是在已经分配好的内存块重新进行分配。
二、释放不同
1、malloc函数:malloc函数分配好的内存块一般要用free(size_t size)来释放内存块。
2、realloc函数:realloc函数分配好的内存块不需要用free(size_t size)来释放内存块。
三、强制转化不同
1、malloc函数:malloc函数需要强制转化。
2、realloc函数:realloc函数不需要强制转化。
这三个函数实现的功能是交换两个数,但实际只有第一和第三种可以成功交换原来的传进来的实参,第二种交换的是形参的值,并不会改变实参的值
首先,要知道一点,函数调用的实质都是实参按值传递给形参,所以第一、二种函数接受的实参都是 int 类型两个数据,此处假设分别是 a 和 b ,而第三种函数接受的实参是一个 int 类型数据的地址,即为 a 和 b (此处的 表现为 “ 取地址符 ” ,在 C 语言中 具有多种功能,比如后面表现出来的 “ 引用符号” 的作用,这称作运算符的重载 )。
那么开始分析函数:
第一种,形参为 int x 和 int y(此处的 表现为 “ 引用符号 ” )
执行的操作为
int x = a ;
int y = b ;
其中 x 和 y 分别是 a 和 b 的引用, 如果我们把变量名理解为一段内存空间的标识符,那么引用可以理解对一段内存空间的另一个标识符,也就是说同一段内存空间可以用多个名字来标志。因为 x 和 a 表示的是同一内存空间的标识符,所以修改 x 所代表的内存空间的值就相当于修改 a 所代表的内存空间的值,y 与 b 的关系同理。
第二种,形参为 int x 和 int y
执行的操作为
int x = a ;
int y = b ;
其中 x 和 y 都是局部变量,x 和 y 所代表的内存空间与 a 和 b 所代表的内存空间不同,这里把 a 和 b 所代表的内存空间的值通过赋值操作分别拷贝了一份,送给了 x 和 y所代表的内存空间,即 x 和 y 所代表的内存空间的值分别与 a 和 b 所代表的内存空间的值是相同的,但它们所代表的内存空间是不一样的,即内存空间的地址不同。所以交换 x 和 y 的内存空间的值并不会影响 a 和 b 的内存空间的值。
第三种,形参为 int * x 和 int * y
执行的操作为
int * x = a ;
int * y = b ;
其中 x 和 y 分别是指向了 a 和 b 的内存空间的指针,x 和 y 也是局部变量,所以跟第二种函数一样,他们与 a 和 b 的内存空间也是不一样的,但是不同点在于,x 和 y 的内存空间里所存储的值是 a 和 b 的地址。所以通过 *x 和 *y 来访问 a 和 b 空间里值,这里的 * 表示是 “ 间接访问符 ”(与 一样,也是 * 的一种重载),它的功能是把 x 和 y 空间中的值(a 和 b 的内存空间的地址)当作地址找到 a 和 b 的内存空间,因此 *x 与 a 是等价的,*y 与 b 是等价的。所以交换 *x 和 *y 的值 就是交换 a 和 b 的值。
最后,总结一下,第一种引用交换和第三种指针交换的区别在于,指针需要另外开辟新的空间来储存地址,而引用并不需要额外的空间。
动态内存分配即分配内存大小在运行时才确定,一般在堆中分配。C语言动态内存分配相关的函数。
malloc
#include stdlib.h
void * malloc (size_t size);
malloc的使用比较直接,一个成功的malloc调用返回分配的size大小的内存的指针。失败时返回NULL并将错误代码置为ENOMEM。
教材中经常出现的用法是将malloc返回的void指针进行强制内存转换然后赋给内存指针,其实是不必要的,在赋值时C语言是可以将void类型指针自动转换成对应的指针的。
calloc
#include stdlib.h
void * calloc (size_t nr, size_t size);
calloc可以分配nr个size大小的内存空间,一般用于一组struct结构体的分配。
那么calloc和malloc有什么区别呢?抛开nr参数不谈(malloc也可以将参数设置为nr*size达到一样的效果),最关键的区别是malloc分配的内存是不保证初始化的,而calloc会将分配的内存都初始化为0.
realloc
#include stdlib.h
void * realloc (void *ptr, size_t size);
realloc函数将ptr指向的内存空间重新分配大小为size并返回新的内存首地址。具体的实现,函数首先会尝试直接在已经分配的内存后进行padding,如果空间足够那么还是返回原来的地址,如果不够,则会寻找新的空间并malloc size个字节,之后再将原先的内容“搬家”到新的内存地址,所以函数的返回值可能和原指针相同,也可能不同。
另外,size参数如果是0,则该函数和free效果相同。如果ptr是NULL,函数的效果和malloc相同~
free
#include stdlib.h
void free (void *ptr);
释放前三个函数申请的内存空间。关于free最经典的问题就是内存泄露(memory leak)。所以,使用前三个分配函数分配的内存一定要记得free掉。