comportement d'un pointeur pas clairement fixé à l'extérieur de l'instruction fixe

StackOverflow https://stackoverflow.com/questions/862936

  •  21-08-2019
  •  | 
  •  

Question

Quelqu'un peut me expliquer pourquoi le code ci-dessous C # ne tombe pas en panne? Pourquoi Visual Studio permet effectivement de le compiler? Je crois comprendre que je reçois un pointeur fixe, mais il est fixé que dans la déclaration « fixe ». Lorsque le pointeur est renvoyé par la fonction « Foo », 'ar la matrice peut être recueillie. Je force alors GC à faire effectivement, mais l'écriture consécutive à la mémoire (qui est maintenant désaffectée) ne provoque pas d'erreur.

class Program
{
    static unsafe byte* Foo()
    {
        byte[] ar = new byte[100];
        fixed (byte* ptr = ar)
        {
            return ptr;
        }
    }

    static unsafe void Main(string[] args)
    {
        byte* ptr = Foo();
        GC.Collect();
        for (int t = 0;;++t) ptr[t%100] = 0;
    }
}
Était-ce utile?

La solution

Eric est juste, mais la réponse que vous voulez sans doute entendre est que « parfois, il est utile de conserver l'adresse extérieure de la déclaration fixe ».

Peut-être la mémoire de ce pointeur est déjà fixé par une autre déclaration fixe un autre endroit, et il est logique de le retourner? Le compilateur ne cherche pas à deviner vous et donner des avertissements bruyants.

Cela dit, je souhaite que CodeAnalysis ou d'autres outils avancés interviendraient ici où le compilateur vous laisser couper votre pied.

Autres conseils

Tout simplement parce que la mémoire est libérée ne veut pas dire que l'écriture lui causerait une erreur de toute nature. Lorsque le garbage collector récupère la mémoire, il marque tout comme libre dans sa carte de mémoire interne -. Elle ne donne pas de retour à l'OS tout de suite, il est donc encore la mémoire valide pour votre processus à utiliser

Bien sûr, à l'aide d'un pointeur à l'extérieur du bloc fixe car il est un très mauvaise idée -. Ne le font pas

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top