2012-03-14 160 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'塊中的第二行來使用'chararray [site]',但這樣做更具可讀性,它不會改變代碼的功能。 – svick 2012-03-14 00:42:30

+0

您通常不需要C++/CLI代碼的大量幫助來破壞堆。這不是。 – 2012-03-14 00:43:54

+0

感謝您的確認。我的代碼在其他地方一定有一些錯誤;我會看看。謝謝你,拉傑。 – user392005 2012-03-14 03:29:12

回答

1

你正在做一個不必要的顯式複製和手動內存分配播放。

你可以在原固定指針只是傳遞給std::string構造:

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

這絕對簡單得多。我相信第二行的'str'是一個錯字。謝謝。 – user392005 2012-03-14 03:33:36

+0

順便說一句,函數返回時,pin_ptr超出了範圍。難道的std :: string構造函數來完成管理數據的複製指向「臨時」非託管數據,以便返回的字符串可以在以後使用? – user392005 2012-07-31 16:15:31

+0

@ user392005是,'的std :: string'副本在其自己的內部緩衝區中的數據。 – alexisdm 2012-07-31 20:06:22

相關問題