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

C# 为什么允许它从函数中返回不安全的指针?,c#,.net,pointers,unsafe,C#,.net,Pointers,Unsafe,我最近看到了一些开源项目,它们确实做到了这一点;从函数返回不安全的指针,例如:“int*input=this.someIterator.GetUnsafePtr()” 根据我的理解,这肯定是完全错误的。不安全指针只能通过“fixed”语句获得,当然,从函数中返回的指针将不再被固定(它们将“丢失”其声明范围),最终导致它们被垃圾收集 但是我也不记得编译器对此给出了任何警告,所以如果你真的可以将“unpinned”指针分散在各处,为什么还要麻烦使用固定语句呢?怎么样,Marshal.AllocHGl

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

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


但是我也不记得编译器对此给出了任何警告,所以如果你真的可以将“unpinned”指针分散在各处,为什么还要麻烦使用固定语句呢?

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


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

我在开源项目中从未见过这样的构造。如果你能在你的问题中提供一些这种用法的例子会更好。它的含义可能取决于行为。
但我同意,不安全指针是有害的,只有在与某些本机库或代码交互时才应使用。
据我所知,你只能在不安全的街区使用这种结构。所以我认为编译器在这里不会给出任何警告。在我看来,最好使用IntPtr(不安全的块只能在完全信任的情况下执行)。
编辑:

@Stephen是对的,IntPtr不会保留对GC集合上对象的引用。

IntPtr不是跟踪指针。如果IntPtr引用托管对象,并且该对象已移动,则指针不会更新。IntPtr和不安全指针之间没有真正的区别,只是IntPtr符合CLS且不“不安全”。你说得对,谢谢。我想我需要再次阅读有关CLR的内容。