Frage

Kann mir jemand erklären, warum die unter C # -Code nicht abstürzt? Warum Visual Studio tatsächlich erlaubt, es zu kompilieren? Mein Verständnis ist, dass ich einen festen Zeiger bin immer, aber es befestigt ist, nur innerhalb der ‚festen‘ Aussage. Wenn der Zeiger von den ‚Foo‘ Funktion zurückgegeben wird, kann das Array ‚Ar‘ gesammelt werden. Ich habe dann GC zwingen, dies tatsächlich zu tun, aber in Folge Schreiben in den Speicher (die jetzt freigegeben wird) verursacht keinen Fehler.

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;
    }
}
War es hilfreich?

Lösung

Eric ist richtig, aber die Antwort, die Sie wahrscheinlich hören wollen, ist, dass „manchmal nützlich, es ist die Adresse außerhalb der festen Aussage zu behalten“.

Vielleicht wird der Speicher von diesem Zeiger bereits durch eine andere feste Aussage irgendwo anders festgelegt, und es macht Sinn, es zurückzubringen? Der Compiler versucht nicht, zweite Sie zu erraten, und laut Warnungen geben.

Wie gesagt, würde ich hoffen, dass CodeAnalysis oder andere fortgeschrittene Werkzeuge würde Schritt hier in denen der Compiler so dass Sie Ihren eigenen Fuß abgeschnitten.

Andere Tipps

Nur weil der Speicher freigegeben wird, bedeutet nicht, dass Sie einen Fehler verursachen würde jegliche Art, um es zu schreiben. Wenn der Garbage Collector Speicher reklamiert, es ist nur markiert sie als frei darin internen Speicher Karte ist -. Es nicht sofort wieder an das OS nicht geben, so ist es immer noch gültig Speicher für Ihren Prozess zu verwenden,

Natürlich einen Zeiger außerhalb des festen Blocks mit für sie ein ist sehr schlechte Idee -. Tun es nicht

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top