2012-03-14 10 views
2

マネージバイト配列をC++/CLIラッパーのstd :: stringに変換しようとしています。しかし、私は後でヒープのいくつかの破損したメモリを見ている。私は変換権を行っているかどうかを確認したいだけでした。以下は、私の方法は、CLIで次のとおりです。管理されたバイト配列をアンマネージ文字列に変換する

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

は何も上記のコードで間違っているように見えるのか?

+0

。 'try'ブロックの2行目を' chararray [site] 'を使うように変更しましたが、それはもっと読みやすく、コードが何をするのかは変わりません。 – svick

+0

通常、C++/CLIコードからヒープを破損させるために多くの助けを必要としません。これはそうではありません。 –

+0

ありがとうございます。私のコードは他にもあるはずです。私は見てみましょう。ありがとう、Raj。 – user392005

答えて

1

不要な明示的なコピーをして、手動でメモリを割り当てて再生しています。

は、あなただけのstd::stringコンストラクタに生の固定のポインタを渡すことができます。私は、そのコードに問題が表示されない

string ByteArrayToStr(array<Byte>^ byteArray) 
{ 
    pin_ptr<unsigned char> temp = &byteArray[0]; 
    return string(reinterpret_cast<char*>(temp), byteArray->Length); 
} 
+0

これは間違いなく簡単です。 2行目の「str」はタイプミスだと思う。ありがとうございました。 – user392005

+0

関数が返ってくると、pin_ptrは範囲外になります。 std :: stringコンストラクタは、返された文字列を後で使用できるように、 'temp'がポイントする管理対象データをアンマネージデータにコピーしますか? – user392005

+0

@ user392005はい、 'std :: string'はデータをそれ自身の内部バッファにコピーします。 – alexisdm

関連する問題