每当您在 C++ 和 Java 中执行new int[X]
where X
is an integer 时,您都会获得对新分配数组的引用。
在 Java 中,数组会自动初始化,因此每个条目都有其默认值(原始数据类型为 0,引用数据类型为 null)。在 C++ 中,数组没有初始化,你会得到垃圾。
如果你这样做:
array = new int[10];
array[0] = 0;
array[1] = 1;
// etc
array = new int[15];
第二次创建数组并将对它的引用放入变量array
中时,您只会丢失对第一个数组的引用。由于它是一个新数组,它将遵守语言新分配数组的规则:在 Java 中,数组现在将指向一个大小为 15 且填充了零的数组;在 C++ 中,array 将指向一个大小为 15 的充满垃圾的数组。
在 Java 中,丢失的数组最终会被垃圾回收。在 C++ 中,您刚刚创建了内存泄漏。
两种语言都禁止您调整数组的大小,或者如您所说,动态扩展数组。您可以创建一个新的,将旧的所有内容复制到新的,然后丢弃旧的。他们可能会提供为您执行这些操作的方法,但您不会扩展现有数组,您只需创建一个新数组并将数据从旧数组复制到新数组。
在 Java 中没有realloc(但它有Arrays.copyOf
,它的工作方式类似),而在 C++(和 C 也是)中,realloc
不会真正扩展数组;它将在别处分配更多内存,释放先前分配的内存,并返回新指针:您必须替换任何指向新地址的现有指针!
最后,对于动态调整自身大小的集合类,它们通常有一个内部数组,并且当该数组变满时,该类会在内部完成所有调整大小的工作:它分配一个更大的新数组,复制元素,并丢弃旧数组。由于数组完全封装在类中,因此您无需担心对旧数组的引用,正如我上面解释的那样。