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; // 将引用转换为指针