理解malloc的工作原理
malloc使用一个数据结构(链表)维护分配空间
链表的构成:分配的空间/指向上一个空间的指针/指向下一个空间的指针/当前空间的大小信息等
注:对malloc分配的空间不要越界访问。因为容易破坏后台维护的结构。导致malloc/free/calloc/realloc不能正常工作
例子:Linux下使用malloc分配内存
#include<stdio.h>
#include<stdlib.h>
void main()
{
int* p1=malloc(4);
int * p2=malloc(4);
int * p3=malloc(4);
printf(“%p\n”,p1);
printf(“%p\n”,p2);
printf(“%p\n”,p3);
}
运行结果为:
0x8a5d008
0x8a5d018
0x8a5d028
解释:
malloc 都分配的4个字节,但是输出的内存地址之间却相差16个字节,多出了12字节,这16字节就是malloc是一个数据结构来维护分配的空间,malloc不能越界访问,如果越界访问了就会破坏该维护内存空间的数据结构,从而使一些相关操作不能正常工作
c++的new与malloc的关系
new是使用malloc来实现的
区别:
new使用malloc后,还要初始化空间.
基本类型,直接初始化成默认值.
UDT类型,调用指定的构造器
delete是使用free来实现的
delete负责调用析构函数,在调用free
new与new[]区别
new只调用一个构造器初始化.
new[]循环对每个区域调用构造器.