我想知道两者有什么区别
int [] arr1=null;
和
int [] arr1=int [5];
关于内存分配?我在某处读到 null 是一个引用变量,因此堆中有一个内存分配,但我认为这int[]
也是一个引用变量,不是吗?所以还是有区别的?
一般来说,我可以在 Java/C++ 中的哪些分配示例中看到堆内存和堆栈内存分配之间的区别?
我想知道两者有什么区别
int [] arr1=null;
和
int [] arr1=int [5];
关于内存分配?我在某处读到 null 是一个引用变量,因此堆中有一个内存分配,但我认为这int[]
也是一个引用变量,不是吗?所以还是有区别的?
一般来说,我可以在 Java/C++ 中的哪些分配示例中看到堆内存和堆栈内存分配之间的区别?
您提出问题的原因如下图所示
在 JAVA
int [] arr1=int [5];
在java中无效
线
int[] arr1=null;
只是创建作为arr1
数组引用的变量。引用是null
,所以只分配了引用本身。它猜测它大约是 4 个字节。
然而
int[] arr1= new int[5];
额外分配一个包含 5 个整数的数组,即额外的4*5
字节。完全4 + 4*5 = 24
字节。
在 C++ 中,此语法无效,但将其更改为:
int * arr1=nullptr;
int * arr2=new int [5];
它基本上做同样的事情:
在arr1
我的示例中,它是指向某些内存的引用/指针,当前不引用/指向任何内容。
arr2
引用/指向一个由 5 个整数组成的数组,这些整数在堆上分配。
如果在稍后阶段,我们需要arr1
指出十个整数,我们可以(再次,在 C++ 中)这样做:
arr1 = new int[10];
在 C++ 中,您还必须使用delete
以下值:
delete [] arr2;
delete [] arr1;
请注意,删除指向 null 的内容是有效的,但删除未初始化的指针是无效的。
在 Java 中,
int [] arr1=int [5];
它创建了数组对象(因为在 java 中,数组被认为是对象)和内存中用于5
primitive( int
)元素的空间。并将每个原始元素初始化为默认值(0
对于 int)。最后将该对象的引用提供给引用变量arr1
。
int [] arr1=null;
只创建一个arr1
没有指向任何东西的引用变量。此行指定arr1
将来可能包含将包含原始整数数组的对象的引用。
null 是 Java 的说法,它没有分配任何堆或没有指向任何东西。在第二个版本中,java 在堆上分配 5 个整数的数组,并让您的变量 arr1(在堆栈上 btw)指向它。
不同之处在于第二个版本分配了一个五元素int
数组,而第一个版本没有。
还为引用本身预留了内存arr1
,但这两种情况都是一样的。
只谈java。
int[] 的类型没有任何 int 实例。它是 int 数组的指针。所以它可以指向int数组的实例。
public class Foo {
public static void main(String[] args) {
int[] a, b, c;
a = new int[] {1,2,3,4,5};
b = new int[] {1,2,3,4,5,6};
c = a;
System.out.println(c.length);
c = b;
System.out.println(c.length);
}
}
a, b 是 int 数组的指向实例。在上面的最后一行代码中,c 和 b 指向同一个实例。