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

时间:2009-02-22 12:51:01

标签: c# .net pointers unsafe

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

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

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

2 个答案:

答案 0 :(得分:3)

如果Marshal.AllocHGlobalMarshal.AllocCoTaskMem都返回IntPtr,可以使用void *函数自由地转换为.ToPointer()吗?

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

答案 1 :(得分:2)

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