문제

관리되는 바이트 배열을 My 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);
    }
}
.

위에 아무 것도 잘못 보이는 것 같습니다.

도움이 되었습니까?

해결책

불필요한 명시 적 복사본을 수행하고 수동 메모리 할당을 사용하여 재생 중입니다.

원시 고정 된 포인터를 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