我最近看到了几个实际上这样做的开源项目;从函数返回一个不安全的指针,例如:“int * input = this.someIterator.GetUnsafePtr()”。
从我的理解,这必须是完全错误的。不安全的指针只能通过“固定”语句获得,当然,从函数中返回的指针不再被固定(它们将“丢失”它们的声明范围),导致它们最终被垃圾收集。
但后来我不记得编译器对此发出任何警告,那么为什么还要使用固定语句,如果你实际上可以实现“unpinned”指针遍布?
答案 0 :(得分:3)
如果Marshal.AllocHGlobal
或Marshal.AllocCoTaskMem
都返回IntPtr,可以使用void *
函数自由地转换为.ToPointer()
吗?
或者指针可以来自非托管代码。您需要fix/pin
内存,因为内存是受管理的,因此只要它不是fixed/pinned
,垃圾收集器就可以自由移动它,使指针无效。
答案 1 :(得分:2)
我从未在开源项目中看到过这样的结构。如果您在问题中提供一些此类用法的样本会更好。它的含义可能取决于行为
但我同意,不安全的指针是邪恶的,只有当你与一些本地库或代码交互时才应该使用它们
据我所知,你只能在不安全的区块中使用这种结构。所以我认为编译器不会在这里给出任何警告。 IMO最好使用IntPtr(不安全的块只能在完全信任的情况下执行)
编辑:
@Stephen是对的,IntPtr不会继续引用GC集合上的对象。