管理対象バイト配列を非管理文字列に変換する
-
13-12-2019 - |
質問
My C ++ / CLIラッパーで管理対象バイト配列をSTD :: Stringに変換しようとしています。ただし、後でヒープ内の破損したメモリを見ています。私が変換権をしているかどうかをチェックしたいだけです。以下は私の方法です:
string ByteArrayToStr(array<Byte>^ byteArray)
{
int size = byteArray.Length;
IntPtr pnt = Marshal::AllocHGlobal(size + 1);
char* chararray = (char*)pnt.ToPointer();
try
{
Marshal::Copy(byteArray, 0, pnt, size);
*(chararray + size) = 0;
return string(chararray);
}
finally
{
Marshal::FreeHGlobal(pnt);
}
}
.
上記のコードで何でも間違っているようですか?
解決
不要な明示的なコピーをやって、手動のメモリ割り当てで再生しています。
生の固定ポインタをstd::string
コンストラクタに渡すことができます。
string ByteArrayToStr(array<Byte>^ byteArray)
{
pin_ptr<unsigned char> temp = &byteArray[0];
return string(reinterpret_cast<char*>(temp), byteArray->Length);
}
. 所属していません StackOverflow