上一篇文章提到delete可以回收数组内存,这是为什么呢,这就需要理解一下delete底层是调用free,而free是怎么回收数组的呢?
由于free和malloc配对使用,malloc的时候大小已经告诉系统了。
free的时候,系统会比对一下这个地址,是不是malloc申请的,如果不是,不给释放
如果是的话,系统就知道要释放多大内存,因为malloc的时候,系统有记录的。
当然了,申请的地址,也记录了的,否则,就无法比对了。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *p;
p=(int *)malloc(sizeof(int)*3);
p[0]=1;p[1]=2;p[2]=3;
p++;
//free(p);/由于p++过,已经不是malloc申请的那个地址了,因此这句运行会报错
p[0]=4;
free(p-1);//这句倒是正确的,因为经过p++,这里的p-1刚好是malloc申请的地址
return 0;
}
另外,问你一个同样的问题:
char *p1 = new char[10];
char *p2 = new char[20];
delete p1[];
delete p2[];
释放p1和p2的时候,没有指明大小,它怎么知道p1是10,p2是20的呢?
如果不知道,它怎么去争取的释放它们呢?
注释Myclass析构函数后将不在报错
根据侯捷老师说的,强行用delete中有图多出的4个字节(右边中间白色的内存)将内存管理的布局打乱,导致报错,如果你没有写析构函数,编译器就不会多出这4个字节,这部分分配出来的空间可以直接被delete也就是free回收。
那就还有几个疑问,new[]和delete[]的源码多做了什么动作呢,可以知道的是delete[]通过多出的字节,调用了3次析构函数,delete对于简单的数据是调用一次析构函数还是根本没有调用析构函数呢? ,(感觉这样问不是很严谨,人家没有析构函数叫调用啥,调用的应该是内置的)
补上流程图
free和malloc做了什么?
他们真的很慢吗?
未完待续
想继续归纳心有余而力不足了,待我自己写出内存池的时候可能会对内存管理理解更深。