首页 文章

为什么允许从函数中返回不安全的指针?

提问于
浏览
2

我最近看到了几个实际上这样做的开源项目;从函数返回一个不安全的指针,例如:“int * input = this.someIterator.GetUnsafePtr()” .

从我的理解,这必须是完全错误的 . 不安全的指针只能通过“固定”语句获得,当然,从函数中返回的指针不再被固定(它们将“丢失”它们的声明范围),导致它们最终被垃圾收集 .

但是后来我不记得编译器对此提出任何警告,那么为什么还要使用固定语句,如果你实际上可以将“unpinned”指针传遍全部?

2 回答

  • 3

    我从未在开源项目中看到过这样的结构 . 如果您在问题中提供一些此类用法的样本会更好 . 它的含义可能取决于行为 .
    但我同意,不安全的指针是邪恶的,只有当你与一些本地库或代码交互时才应该使用它 .
    据我所知,你只能在不安全的区块中使用这种结构 . 所以我认为编译器不会在这里给出任何警告 . IMO最好使用IntPtr(不安全的块只能在完全信任的情况下执行) .
    编辑:
    @Stephen是对的,IntPtr不会继续引用GC集合上的对象 .

  • 2

    怎么样, Marshal.AllocHGlobalMarshal.AllocCoTaskMem ,都返回IntPtr,可以使用 .ToPointer() 函数自由地转换为 void *

    或者指针可以源自非托管代码 . 你需要 fix/pin 内存,因为内存是受管理的,因此只要它不是 fixed/pinned ,垃圾收集器就可以自由移动它,使指针无效 .

相关问题