【问题标题】:.NET Marshal.PtrToStringUni(IntPtr) vs. new String(char*).NET Marshal.PtrToStringUni(IntPtr) 与 new String(char*)
【发布时间】:2011-07-22 04:10:50
【问题描述】:

new String(char*)Marshal.PtrToStringUni(IntPtr) 之间有什么区别,除了一个明显的事实,一个是 char*,一个是 IntPtr?我什么时候应该使用哪个?

我记得大约几年前在使用构造函数时遇到了一个真的随机访问违规,它花费了大量时间来追踪,而当我使用 PtrToStringUni 时它就消失了.也许这不是真正的原因,我不知道,但似乎是。

不过,我从来没有弄清楚有什么区别。有什么想法吗?


编辑:

This question 回答了我的大部分问题;但是:我的访问违规是否有任何解释,还是因为其他原因?

【问题讨论】:

标签: c# .net string marshalling


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    不同之处在于你不能在不进入不安全代码的情况下使用指针。 char* 是一个实际的指针。 IntPtr 包装了一个指针。

    来自您链接的 msdn:

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

    您的 char[] 是否以空值结尾?

    【讨论】:

    • 我以为你没有使用 unsafe,但显然没有它,构造函数甚至不会出现。编辑了我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-14
    • 2010-09-08
    • 2010-12-27
    • 2011-06-17
    • 1970-01-01
    • 2017-05-18
    • 1970-01-01
    相关资源
    最近更新 更多