2017-09-06 42 views
0

Java中的以下代码是否安全?我担心的是,在函数f()变量arr被分配到堆栈上,因此在离开作用域时被释放,但仍被引用到作用域之外。在java中使用范围以外的本地堆栈变量

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

的'arr'变量的寿命结束时'F'确实,但*阵列*的寿命是从可变的寿命分开。 – user2357112

+0

您不必担心Java中的内存管理问题。如果您习惯于C++,请考虑智能指针。 – Dukeling

+0

但仍然不是存储生命周期变量的变量引用的'Array'变量? –

回答

1

在F你创建变量ARR是一个int数组,然后构建其结束有一个指针,指向同一原始int数组Array对象。

的f函数然后结束返回Array对象 - 变量ARR超出范围,但所述存储器位置它指向仍然通过引用被返回Array对象这样的存储器位置不能被垃圾收集。然后将返回值分配给主方法的变量a,这意味着在main方法结束之前arr原先指向的内存仍然无法被垃圾收集。这是一个事实,即最初被称作改编的值作为主要功能

简短的回答的一部分输出所示,是的,这是安全的。内存是没事的时候是左指向它/当它不再被引用

1

它是安全的,因为Java使用引用跟踪它收集垃圾。即使当arr超出f的范围,数据仍然被a引用。垃圾收集器不会在指定返回值所需的时间内清除它。

在一个侧面说明,尽量避免使用相同的名称既作为局部变量和领域。