Domanda

Sto cercando di convertire un array di byte gestito su Std :: String nel mio wrapper C ++ / CLI;Tuttavia, sto vedendo un po 'di memoria corrotta nell'heap più tardi.Volevo solo controllare se sto facendo la conversione destra.Sotto è il mio metodo è 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);
    }
}
.

Qualcosa sembra sbagliato nel codice sopra?

È stato utile?

Soluzione

Si esegue una copia esplicita inutile e la riproduzione con un'allocazione manuale della memoria.

È possibile passare il Puntatore Pinned Raw al costruttore std::string:

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top