以下代码在Java中是否安全?我担心的是,函数f()
变量arr
在堆栈上分配,因此在离开作用域时被释放,但仍然在作用域之外被引用。
public class Main {
public static class Array {
public final int[] arr;
public Array(int arr[]) {
this.arr = arr;
}
}
public static Array f() {
int arr[] = {1, 2, 3};
return new Array(arr);
}
public static void main(String[] args) {
Array a = f();
System.out.println(a.arr[0]);
System.out.println(a.arr[1]);
System.out.println(a.arr[2]);
}
}
答案 0 :(得分:1)
在f中创建变量arr,它是一个int数组,然后构造一个Array对象,最终有一个指向同一个原始int数组的指针。
函数f然后结束返回Array对象 - 变量arr超出范围但它指向的内存位置仍然被返回的Array对象引用,因此内存位置不能被垃圾回收。然后将返回值分配给main方法的变量a,这意味着在main方法结束之前,arr最初指向的内存仍然无法进行垃圾回收。事实证明,最初称为arr的值是作为主函数
的一部分输出的简短的回答,是的,这是安全的。当没有任何内容指向它/不再引用时,内存被垃圾收集
答案 1 :(得分:1)
这是安全的,因为java使用引用来跟踪它。即使arr超出f中的范围,数据仍然由a引用。垃圾收集器不会在分配返回值所花费的时间内清除它。
另外,请注意避免使用与本地变量和字段相同的名称。