2

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

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

但是我也不记得编译器对此有任何警告,那么如果您实际上可以将“未固定”指针分布在各处,为什么还要费心使用固定语句呢?

4

2 回答 2

3

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

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

于 2009-02-22T12:58:45.020 回答
2

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

于 2009-02-22T13:04:25.723 回答