La conversion géré tableau d'Octets non géré chaîne
-
13-12-2019 - |
Question
Je suis en train de convertir un gérés tableau d'octets à std::string dans mon C++/CLI wrapper;cependant, je vois certains de corruption de mémoire dans le tas plus tard.Voulais juste vérifier si je suis en train de faire la conversion.Ci-dessous est ma méthode est de la 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);
}
}
Les choses semblent mal dans le code ci-dessus?
La solution
Vous faites un inutile copie explicite et de jouer avec un manuel d'allocation de mémoire.
Vous pouvez simplement passer le raw pointeur épinglé à std::string
constructeur:
string ByteArrayToStr(array<Byte>^ byteArray)
{
pin_ptr<unsigned char> temp = &byteArray[0];
return string(reinterpret_cast<char*>(temp), byteArray->Length);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow