堆内存储器分配不连续

堆内存分配不连续?
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;

int main()
{
   int *aa=new int[4];
   int *bb=new int[4];
   int *cc=new int[4];
   int *dd=new int[4];
   int *ee=new int[4];
   int *ff=new int[4];

   cout<<int(aa)<<endl;
   cout<<int(bb)<<endl;
   cout<<int(cc)<<endl;
   cout<<int(dd)<<endl;
   cout<<int(ee)<<endl;
   cout<<int(ff)<<endl;

   return 1;
}

输出结果:
2637736
2637760
2637784
2637808
2637704
2637728

问题1:1个int类型的变量占4个自己,4个就是16字节,为什么输出的数据相差24呢?
问题2:输出的结果为什么从ee地址处开始不连续?

------解决方案--------------------
为啥一定要连续呢。
内存管理器自己需要很多额外开销的。
------解决方案--------------------
操作系统具有内存管理策略,一般都会分配多于分配空间的内存,多余的部分用于保存分配的内存信息,delete的时候就会根据这些信息来进行
------解决方案--------------------
crt的自己的内存分配算法,为啥一定要连续呢?
------解决方案--------------------
new分配的空间需要额外的一段储存所分配空间信息的空间  如分配空间的大小  以及所分配空间的地址等

而储存这些信息的内存空间并没有返回给用户用  而是直接指向用户需要的16字节的起始地址

为什么ee处不连续  堆是链式的数据结构   是从系统请求请求存储空间   只要找到合适的可用的地址就会返回 

只是我的理解  可能不太正确    

------解决方案--------------------
楼主输出地址的时候推荐格式化成16进制的,看起来舒服,直观。
同意4楼的说法
楼主稍微了解一下内存管理的模型就理解了
------解决方案--------------------
千万不要觉得连续new就可以得到连续的内存空间。
你可以花时间去研究学习C++内存管理。

如果不打算仔细研究C++内存管理,你可以简单的理解为:每一次用new分配内存,分配的起地址都是不确定的。

在C++中,只有数组形式的内存分配方式可以得到真正连续的得到一段内存空间。
你的程序看起来前几行是连续的,不过那是不安全的。程序运行起来根本不能保证aa和bb一定是连续的。

------解决方案--------------------
系统觉得哪能用,哪分配合适就分配在哪,为什么要连续呢,还有内存管理中的分页,分段啊等机制会影响,这个当然没有问题了
------解决方案--------------------
用new分配内存本来就是不连续的
------解决方案--------------------
优先使用小的满足要求的内存块,否则空洞太多。
------解决方案--------------------
堆内存本来就是不连续的 是一个双向连表