2017-09-06 3 views
0

Le code suivant est-il sûr en Java? Ma préoccupation est due au fait que dans la fonction f() la variable arr est allouée sur la pile et en tant que telle est désaffectée à la sortie de la portée mais est toujours référencée en dehors de la portée.Utilisation de la variable de pile locale en dehors de la portée dans 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

La durée de vie de la variable 'arr' se termine lorsque' f' le fait, mais la durée de vie du * tableau * est distincte de la durée de vie de la variable. – user2357112

+0

Vous n'avez pas à vous soucier de la gestion de la mémoire en Java. Si vous êtes habitué au C++, pensez aux pointeurs intelligents. – Dukeling

+0

mais n'est toujours pas la variable de stockage de la variable 'Array' d'une variable dont la durée de vie est terminée? –

Répondre

1

f Dans la création de variable arr qui est un tableau int, puis construire un objet Array qui finit par avoir un pointeur sur cette même matrice primitive int. La fonction f finit alors de renvoyer l'objet Array - la variable arr sort de la portée mais l'emplacement de mémoire vers lequel elle pointe est toujours référencé par l'objet Array retourné afin que l'emplacement de mémoire ne puisse pas être récupéré. La valeur de retour est ensuite affectée à la variable a de votre méthode principale, ce qui signifie que la mémoire à laquelle elle a été initialement pointée ne peut toujours pas être récupérée avant la fin de la méthode principale. Ceci est démontré par le fait que les valeurs de ce qui s'appelait à l'origine arr sont sorties dans le cadre de la fonction principale

Réponse courte, oui c'est sûr à faire. La mémoire est collectée lorsque rien ne pointe dessus/quand elle n'est plus référencée

1

C'est sûr car java utilise des références pour le suivre. Même lorsque arr sort de la portée de f, les données sont toujours référencées par a. Garbage collector ne le nettoiera pas dans le temps nécessaire pour que la valeur de retour soit affectée non plus. Sur une note de côté, essayez d'éviter d'utiliser le même nom à la fois comme variable locale et comme champ.