mallo与new、指针与引用

malloc函数的工作机制

当malloc函数被调用的时候,它会沿着空闲链表在堆区空间中寻找一整片满足需求的空间,将程序需求的空间分配给用户,剩下部分(如果有剩余的话)返回到空闲链表上。

当调用free()函数时,它会将用户释放的空间连接到空闲链表上。

当malloc函数被多次调用之后,空闲链表就会被切成许多分散的小块,此时如果用户申请一块比较大的空间时,空闲链表上可能就没有满足用户大小的正片空间了,于是malloc函数请求延时,开始整理整理各个分散的小块,将它们合并成较大的内存块,并返回给用户。

如果找不到满足大小的内存块,那么malloc函数就会返回NULL;如果找到了满足需求的空间,那么就会返回void*类型的指针。因此检查malloc函数的返回值是很重要的。

malloc与new的区别

①new是C++独有的操作符,而malloc是c++/c的库函数,前者需要编译器的支持,后者需要头文件的支持。

②new申请内存时不需要指定内存块的大小,编译器会根据类型信息自行计算出所需内存的大小。而malloc需要程序员显式地指出所需内存的大小。

③new申请内存成功时,返回的是对象类型的指针,类型与对象严格匹配,无须进行类型转换。而malloc申请内存成功则是返回void *类型 ,需要通过类型转换将void*转换成我们需要的类型。

④C++允许重载new/delete操作符,而malloc和free是一个函数,并不能重载。

⑤new内存分配失败时,会抛出bad_alloc异常。malloc分配内存失败时返回NULL。

 ⑥new操作符从自由存储区上为对象动态分配内存空间,而malloc函数从堆上动态分配内存。自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请,该内存即为自由存储区。

指针与引用的区别

概念

指针指向一块内存,它的内容是所指内存的地址,在32位系统指针变量一般占用4字节内存。

引用是某个变量的别名,编译器不会为引用开辟内存空间,它和它引用的变量共用同一块内存空间。

区别

属性上不一样:指针是一个实体,而引用仅是个别名,有空指针,但没有空引用,有多级指针,但没有多级引用。

指针和引用的自增(++)运算意义不一样:指针是对内存地址的自增,自增后指针向后偏移一个类型的大小;引用是对值的自增,自增后引用的实体的值增加1。

在sizeof中的意义不一样:“sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身的大小,在32位系统指针变量一般占用4字节内存。

引用只能在定义时被初始化一次,之后不可变;指针可变;

int x = 5;
int& ref = x; // 合法,ref是x的别名
int y = 10;
int& ref = y; // 非法,ref不能再次作为y的别名


int x = 5;
int* ptr = &x; // 合法,ptr被初始化为指向x的指针
int y = 10;
ptr = &y; // 合法,ptr现在指向y

指针和引用的相互转化

指针转引用

int x = 5;
int* ptr = &x;
int& ref = *ptr; // 将指针转换为引用

引用转指针

int y = 10;
int& ref2 = y;
int* ptr2 = &ref2; // 将引用转换为指针

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值