Question

Nous avons un code similaire à celui-ci dans l'un de nos projets. Quelqu'un peut-il expliquer (en anglais simple) pourquoi la déclaration fixe est nécessaire ici?

class TestClass
{
    int iMyVariable;
    static void Main()
    {
        TestClass oTestClass = new TestClass();
        unsafe
        {
            fixed (int* p = &oTestClasst.iMyVariable)
            {
                *p = 9;
            }
        }
    }
}
Était-ce utile?

La solution

Cela corrige le pointeur en mémoire. Les langages ramassés de déchets ont la liberté de déplacer des objets dans la mémoire pour plus d'efficacité. Tout cela est transparent pour les programmeurs car ils n’utilisent pas vraiment les pointeurs dans "normal". Code CLR. Toutefois, lorsque vous avez besoin de pointeurs, vous devez les corriger en mémoire si vous souhaitez les utiliser.

Autres conseils

La déclaration fixe sera " épingler ". ; la variable en mémoire afin que le ramasse-miettes ne le déplace pas lors de la collecte. S'il déplaçait la variable, le pointeur deviendrait inutile et, lorsque vous l'utiliseriez, vous tenteriez d'accéder à quelque chose que vous n'aviez pas l'intention de modifier ou de le modifier.

Vous en avez besoin partout où vous faites de l'arithmétique de pointeur, pour empêcher le ramasse-miettes de le déplacer sur vous.

Comme vous utilisez le mode non sécurisé (pointeur), l’instruction fixe alloue un espace mémoire spécifique à cette variable. Si vous ne définissez pas l’instruction fixe, le ramasse-miettes peut déplacer la variable n’importe où, quand il le souhaite.

J'espère que cela vous aidera.

MSDN présente un exemple très similaire. L'instruction fixe bloque fondamentalement le ramassage des ordures. En .Net, si vous utilisez un pointeur sur un emplacement de mémoire, le moteur d’exécution peut réaffecter l’objet à un "meilleur". emplacement à tout moment. DONC, si vous voulez accéder directement à la mémoire, vous devez la réparer.

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