【问题标题】:Converting managed Byte array to unmanaged string将托管字节数组转换为非托管字符串
【发布时间】:2012-03-14 00:36:45
【问题描述】:

我正在尝试在我的 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);
    }
}

上面的代码有什么问题吗?

【问题讨论】:

  • 我在该代码中看不到任何问题。我会将try 块中的第二行更改为使用chararray[site],但这会更具可读性,它不会改变代码的作用。
  • 您通常不需要 C++/CLI 代码的大量帮助来破坏堆。不是这个。
  • 感谢您的验证。我的代码在其他地方一定有一些错误;我来看看。谢谢你,拉杰。

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


【解决方案1】:

您正在执行不必要的显式复制并手动分配内存。

您可以将原始固定指针传递给std::string 构造函数:

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

【讨论】:

  • 那肯定要简单得多。我相信第二行中的“str”是一个错字。谢谢。
  • 顺便说一句,当函数返回时 pin_ptr 超出范围。 std::string 构造函数是否将 'temp' 指向的托管数据复制到非托管数据中,以便以后可以使用返回的字符串?
  • @user392005 是的,std::string 将数据复制到自己的内部缓冲区中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-11
  • 2011-09-14
  • 2011-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-16
相关资源
最近更新 更多