这个问题没有提到语言,因此我将选择基于“ C”的数组作为答案。
数组被分配为单个内存块。增长数组是有问题的,因为正确执行此操作的唯一方法是在最后增长它。为了增加大小N,在数组的末尾必须在下一个分配的地址之前至少有N个空闲字节。
要支持这种类型的分配,必须在虚拟地址空间中分配分配。这既消除了使内存分配彼此更接近的好处,又增加了碎片的产生。面对大多数试图将内存打包在一起并减少碎片的内存管理器,这是不对的。
在内存中有足够空间的地方分配一个新数组并复制该数组,这根本不是一般解决方案。原因是该数组的先前位置对用户而言可以通过指针看到。
int* array = malloc(int*someSize);int* pointer1 = &(arr[2]);growArray(&array, 12); // Can't move because pointer1 knows the address of the array



