我想知道将固定指针从一个方法返回到另一个方法是否安全 - 固定对象是否仍然保持固定?例如
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无法决定何时指针应该变为非固定状态.