在C#中返回一个固定指针

本文关键字:一个 定指 指针 返回 | 更新日期: 2023-09-27 18:19:42

我想知道从一个方法向另一个方法返回固定指针是否安全-固定对象是否仍然保持固定?例如

struct TestData
{
    public int value;
}
public class Class1
{
    private TestData data; 
    public unsafe TestData* GetDataPtr()
    {
        fixed (TestData* ptr = &data)
        {
            // IS THIS SAFE?
            return ptr; 
        }
    }
}
public class Class2
{
    public unsafe void Test()
    {
        Class1 x = new Class1();
        TestData* ptr = x.GetDataPtr(); // is this still fixed?
        ptr->value = 2; 
    }
}

我问的原因是使用这种风格的东西,我一直在获得AccessViolation异常。但自从我把它改为直接从Class1设置值后,我就没有看到这个问题发生。

编辑:我认为它可能是固定的原因是,如果在"TestData*ptr=x.GetDataPtr()"之外,你试图将你得到的fixed()放入"你不能获取已经固定的表达式的地址"。。我现在明白了,尽管它说我在"Test()"中的var"ptr"已经被修复了。。

在C#中返回一个固定指针

从方法返回将结束fixed的作用域,因此返回后指针将不再固定。向上传递固定指针是安全的,例如

fixed(TestData* ptr = &data) {
    MyFunction1(ptr);
    MyFunction2(ptr);
}

但是返回会使指针再次不固定。

从逻辑上讲,这是有道理的:在您从调用返回指针后,CLR没有其他方法可以决定指针何时变为非固定指针。