.NET Marshal.PtrToStringUni (IntPtr) против новой строки (char *) - PullRequest
5 голосов
/ 22 июля 2011

В чем разница между new String(char*) и Marshal.PtrToStringUni(IntPtr), кроме очевидного факта, что каждый берет char*, а другой - IntPtr?Когда я должен использовать какой?

Я помню, что получил действительно нарушение произвольного доступа, которое занимало огромное количество времени, чтобы отследить пару лет назад при использовании конструктора, и оно пошлопрочь, когда я использовал PtrToStringUni.Может быть, это не было настоящей причиной, я не знаю, но, похоже, это так.

Я так и не понял, в чем разница.Есть идеи?


Редактировать:

На этот вопрос есть ответ на большинство моих вопросов;однако: есть ли какое-либо объяснение моего нарушения доступа, или это было из-за чего-то еще?

Ответы [ 2 ]

1 голос
/ 26 июля 2011

Основываясь на связанном ответе, я могу догадаться, что вы не прикрепили указатель на символ *, из-за чего (наугад) GC переместил символ *, пока конструктор все еще работал, вызывая нарушение доступа , Просто предположение:)

0 голосов
/ 22 июля 2011

Разница в том, что вы не можете использовать указатели, не углубляясь в небезопасный код.char * является фактическим указателем.IntPtr переносит указатель.

Из связанного с вами msdn:

"Если указанный массив не заканчивается нулем, поведение этого конструктора зависит от системы. Например, такая ситуация можетвызвать нарушение прав доступа. "

Ваш char [] имеет нулевое значение?

...