在java中使用外部作用域的局部堆栈变量

时间:2017-09-06 21:53:51

标签: java stack

以下代码在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]);
 }
}

2 个答案:

答案 0 :(得分:1)

在f中创建变量arr,它是一个int数组,然后构造一个Array对象,最终有一个指向同一个原始int数组的指针。

函数f然后结束返回Array对象 - 变量arr超出范围但它指向的内存位置仍然被返回的Array对象引用,因此内存位置不能被垃圾回收。然后将返回值分配给main方法的变量a,这意味着在main方法结束之前,arr最初指向的内存仍然无法进行垃圾回收。事实证明,最初称为arr的值是作为主函数

的一部分输出的

简短的回答,是的,这是安全的。当没有任何内容指向它/不再引用时,内存被垃圾收集

答案 1 :(得分:1)

这是安全的,因为java使用引用来跟踪它。即使arr超出f中的范围,数据仍然由a引用。垃圾收集器不会在分配返回值所花费的时间内清除它。

另外,请注意避免使用与本地变量和字段相同的名称。

相关问题