.NET Marshal.PtrToStringUni(IntPtr)与new String(char*)的区别

5
除了一个使用char*,一个使用IntPtr之外,new String(char*)Marshal.PtrToStringUni(IntPtr)有什么区别?我应该在什么时候使用哪个?
我记得大约几年前使用构造函数时遇到了一个非常随机的访问冲突,花费了很长时间才找到问题所在,但是当我使用PtrToStringUni时,这个问题就消失了。也许那不是真正的原因,我不知道,但是看起来是这样。
然而,我从未弄清楚它们之间的区别。有任何想法吗?
编辑: 这个问题回答了我大部分的问题;然而:我的访问冲突有什么解释,还是因为其他原因?

复制,https://dev59.com/3UvSa4cB1Zd3GeqPhc9T - adontz
@adontz:哇,你说得对--不过这并不能解释访问冲突。我会进行编辑。 - user541686
2个回答

1

根据链接的答案,我猜测您没有将指针固定到char*,这导致(随机)在构造函数仍在运行时GC移动了char*,从而导致访问冲突。只是一个猜测 :)


0

区别在于,如果不进入不安全代码,您无法使用指针。char*是实际的指针。IntPtr包装了一个指针。

从您链接的msdn中:

“如果指定的数组没有以null结尾,则此构造函数的行为取决于系统。例如,这种情况可能会导致访问冲突。”

您的char[]是否以null结尾?


我原以为你没有使用不安全的代码,但显然如果不使用它,那个构造函数甚至都不会出现。我已经编辑了我的回答。 - hoodaticus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接