malloc、free、new、delete之间的关系,动态内存原理?

想问的有很多,比如:堆的本质是什么?是一个类似指针链表的东西吗?

当【new int [100]】时,这个数组的内存地址是不是连续的一大整块?如果不连续,那么分配的时候又是如何跳跃的?
在delete这个数组时,编译器怎么知道要删除的内存有多大,删除完A地址后,编译器又怎么知道下一个要删除的是B地址?

还有,new []和delete可以配套使用吗?

楼主请进传送门:http://www.perfect-is-shit.com/analyse-new-delete-malloc-free.html

malloc分配要free释放,new要delete释放

数组元素地址是连续的,如果数组中元素是指针那么指针所指对象不一定是连续的

堆上的数据就是由你控制的,而不是操作系统自动帮你释放的,这点跟栈上数据不同

malloc对应free,new对应delete,new[]对应delete[]

对地址分配是有操作系统内存分配器处理的,空闲内存映射表,系统会自动查找空闲内存中的第一个合适大小的空间分配, 它会帮你在空余空间中寻找符合你要求的空间。

分配来的空间,在编程使用时是连续的,否则无法实现后续的功能要求。

malloc 对应 free,new 对应 delete,删除时由编译器确定大小。这个是编辑原理,在分配时不只是指针,还是其它信息程序不知道的。

因为现代操作系统拥有虚拟内存机制,每个程序的内存是完全独立的,比如程序a的0x00001234和b的0x00001234是不同的,处于不同的物理内存,程序无须关心物理内存而且也不能关心,因此new出来的内存是连续的。同时,虚拟内存大小也是固定的,这个大小和指针的位数有关,比如32位程序虚拟内存永远是4G,和物理内存大小无关。
至于说编译器如何知道多大的问题。。编译器可以在申请内存时预先在某个位置存储上某个指针到存储大小的对应关系,这样释放内存时就可以知道大小了,当然,编译优化可能会把那些申请固定长度的内存的释放位置预先计算好,然后释放的代码早在编译时就指定长度了。

这些都是语言规范,语言规范规定malloc申请的要用free释放,new申请的要用delete释放。
malloc和new具体怎么实现语言规范是不管的,用堆可以,用二叉树也可以,放在内存,文件系统,数据库或者别的计算机上都可以。
malloc和new给你的是一块指定大小的内存的地址,没有多块不连续内存这一说,至于怎么通过地址就可以实现free和delete,是具体的实现要考虑的事情。
分配和释放不配套是标准里规定的不定义行为,具体实现者做什么都符合标准,包括格式化用户的硬盘或者发射核导弹。