繁体   English   中英

可以在 C# 中使用转换后的指针值的引用返回吗?

[英]Is it ok to use a reference return of the converted pointer's value in C#?

可以使用转换后的指针值的引用返回吗?

我已经阅读了这个问题。 C#中如何实现引用返回?

可以使用下面关于垃圾收集器的内存移动问题的代码。 (Helper.GetReference() & Helper.GetPointer())

class Program
{
    static unsafe void Main(string[] args)
    {
        byte[] bytes = new byte[1024];

        ref SomeStruct reference = ref Helper.GetReference<SomeStruct>(bytes);
        reference.field1 = 1;
        reference.field2 = 2;

        SomeStruct* pointer = Helper.GetPointer<SomeStruct>(bytes);
        pointer->field1 = 3;
        pointer->field2 = 4;
    }
}

public static class Helper
{
    // Can I use this?
    public static unsafe ref T GetReference<T>(byte[] bytes) where T : unmanaged
    {
        fixed (byte* p1 = bytes)
        {
            T* p2 = (T*)p1;
            return ref *p2;
        }
    }

    // Shouldn't I use it?
    public static unsafe T* GetPointer<T>(byte[] bytes) where T : unmanaged
    {
        fixed (byte* p1 = bytes)
        {
            return (T*)p1;
        }
    }
}

public struct SomeStruct
{
    public int field1;
    public int field2;
}

据我所知,这两种方法都是不安全的……是的,它确实可以编译,但是,因为您在Helper方法中使用了unsafe并引用了相同的内存,所以您的安全网已被炸毁。

指向的是可由垃圾收集器(也就是您的数组)移动的一部分内存(托管对象),这可能会给您留下一个悬空指针

您需要在Main方法中修复fixed )数组以确保安全(我认为是他们的方式),或者您的结构

例如

fixed (byte* p = bytes) // even though p isn't being used
{
   SomeStruct* pointer = Helper.GetPointer<SomeStruct>(bytes);
   pointer->field1 = 3;
   pointer->field2 = 4;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM