【问题标题】:Return a fixed pointer in C#在 C# 中返回一个固定指针
【发布时间】:2012-01-05 14:18:28
【问题描述】:

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

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 unsafe


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 这是一个很好的观点,谢谢! (请参阅我的编辑,了解为什么我认为它可能会这样做)
    猜你喜欢
    • 2013-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-24
    • 2014-06-28
    • 2020-09-25
    • 1970-01-01
    相关资源
    最近更新 更多