Beispiel #1
0
    public static int Main()
    {
        float[]  arr     = new float[100];
        GCHandle handle1 = GCUtil.Alloc(arr, GCHandleType.Pinned);
        GCHandle handle2 = GCUtil.Alloc(arr, GCHandleType.Normal);

        IntPtr oldaddr, newaddr;

        oldaddr = GCUtil.AddrOfPinnedObject(handle1);
        Console.WriteLine("Address of obj: {0}", oldaddr);

        GC.Collect();
        GC.WaitForPendingFinalizers();

        //			handle1.Free();		// arr should only have normal handle now
        GCUtil.Free(ref handle1);
        GC.Collect();
        GC.WaitForPendingFinalizers();

        GC.Collect();
        GC.WaitForPendingFinalizers();

        try
        {
            Console.WriteLine("Address of obj: {0}", handle1.AddrOfPinnedObject());
        }
        catch (Exception e)
        {
            Console.WriteLine("Caught: " + e);
        }

        arr = null;
        GC.Collect();

        // Pinning the arr again..it should have moved
        GCHandle handle3 = GCUtil.Alloc(arr, GCHandleType.Pinned);

        newaddr = GCUtil.AddrOfPinnedObject(handle3);

        Console.WriteLine("Address of obj: {0}", newaddr);

        if (oldaddr == newaddr)
        {
            Console.WriteLine("Test failed!");
            return(1);
        }
        else
        {
            Console.WriteLine("Test passed!");
            return(100);
        }
    }