2017-09-06 80 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引用。垃圾收集器不會在指定返回值所需的時間內清除它。

在一個側面說明,儘量避免使用相同的名稱既作爲局部變量和領域。