質問

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);
}
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top