在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"已经被修复了。。
从方法返回将结束fixed
的作用域,因此返回后指针将不再固定。向上传递固定指针是安全的,例如
fixed(TestData* ptr = &data) {
MyFunction1(ptr);
MyFunction2(ptr);
}
但是返回会使指针再次不固定。
从逻辑上讲,这是有道理的:在您从调用返回指针后,CLR没有其他方法可以决定指针何时变为非固定指针。