c++ - 将托管字节数组转换为非托管字符串

标签 c++ c++-cli unmanaged-memory

我正在尝试将托管字节数组转换为 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);
}

关于c++ - 将托管字节数组转换为非托管字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9694341/

相关文章:

c++ - xerces - 处理标签名称中的命名空间

c# - 如何将 C++/CLI 程序编译成 .lib 并将其与纯非托管 C++ 程序链接?

C# 使用 Memory<T> 或 ArraySegment<T> 访问非托管数组?

c# - .NET 应用程序突然出现非托管内存的极端增长

c++ - 打印从 Python 传递的 char 指针数组的问题

c++ - Push_back 是否会导致二维 vector 中的引用无效?

c# - 调用 C++/CLI 包装器时出现外部异常 E0434352

com - C++/CLI 64 位 COM

c++ - 检测给定类型是否为 C++03 中的函数类型