如何将句柄字符串转换为std :: string

时间:2014-11-12 00:04:59

标签: c++-cli

我正在尝试将句柄字符串转换为普通字符串。我虽然我使用的方法正在工作,但是当我查看调试器时,看起来我的字符串的一半已经在创建chars变量的行上被切断了。知道为什么以及将句柄字符串转换为普通字符串的正确方法是什么?

std::string convert(String^ s) {
    const char* chars = (const char*)(System::Runtime::InteropServices::Marshal::
        StringToHGlobalAnsi(s)).ToPointer();
    string myNewString = std::string(chars);
    return myNewString;
}

1 个答案:

答案 0 :(得分:1)

可能是调试器切断了字符串的显示。你没有提到你使用的字符串有多长,但是调试器无法显示无限长度,所以它必须在某个时刻将其剪掉。

要验证这一点,请尝试将myNewString打印到控制台,或通过Debug::WriteLineOutputDebugString打印到调试器。

但是,您的代码中存在一个重大问题:使用StringToHGlobalAnsi分配内存后,必须使用FreeHGlobal释放内存。

如果您想继续使用StringToHGlobalAnsi,请按以下方式修复:

std::string convert(String^ s) {
    IntPtr ptr = Marshal::StringToHGlobalAnsi(s);
    string myNewString = std::string((const char*)ptr.ToPointer());
    Marshal::FreeHGlobal(ptr);
    return myNewString;
}

但是,使用marshal_as方法可能更容易。这将为您处理一切。

std::string output = marshal_as<std::string>(managedString);