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

use*_*265 3 c# unsafe fixed

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

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; 
    }
}
Run Code Online (Sandbox Code Playgroud)

我问的原因是使用这种风格的东西我一直在获得AccessViolation异常.但是因为我将它改为例如直接从Class1设定值我没有看到问题发生.

编辑:我认为可能修复的原因是,如果从"TestData*ptr = x.GetDataPtr()"之外你试图将fixed()置于"你不能获取已经修复的表达式的地址"...我现在得到它虽然它正在谈论我在"Test()"中的var"ptr"已经被修复了..

das*_*ght 11

从方法返回结束范围fixed,因此一旦返回指针就不再固定.将固定指针传递到链上是安全的,例如

fixed(TestData* ptr = &data) {
    MyFunction1(ptr);
    MyFunction2(ptr);
}
Run Code Online (Sandbox Code Playgroud)

但是返回使得指针再次不固定.

从逻辑上讲,这是有道理的:在您从调用返回指针后,CLR无法决定何时指针应该变为非固定状态.