1、动态内存在申请后,有一个开头标志,其中存放长度信息,有一个结尾标志,有利于碎片内存拼接,苹果公司在内存管理部分做的比其他公司好,所以苹果看起来内存小,当到后期也不卡。
2、内存中常见的3中错误:
(1)越界,将尾部信息篡改
int *p=(int*)malloc(10)//申请10个字节
for(int i=0;i<10;i++)
{
p[i]=0;//崩溃,越界
}
(2)移动指针,指针不在指向首地址,所以系统找不到开头标志,不知道多少个格子。这样遇到free(p)就崩溃
int*p=(int*)malloc(10*sizeof(int))
for(int i=0;i<10;i++)
{
*(p+i)=0;//*p=0;p++;
}
free(p);//崩溃,找不到首地址
(3)重复释放内存
int *p=(int*)malloc(10*sizeof(int))
for(int i=0;i<10;i++)
{
p[i]=0;//动态内存初始化为0
}
free(p);
free(p);//崩溃,已经释放,没有可再次释放的内存