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