wstring到LPCWSTR无法使用c_str()

时间:2013-12-29 19:02:51

标签: c++ visual-c++ c++11 directx directx-11

我目前正在使用DirectX11并尝试将UTF8字符串转换为LPCWSTR。我写了一个实用函数来帮助我进行转换:

// Convert an UTF8 string to a wide Unicode String
std::wstring WidenString(const std::string &string)
{
    int size_needed = MultiByteToWideChar(CP_UTF8, 0, string.c_str(), string.size(), NULL, 0);
    std::wstring wstring(size_needed, 0);
    MultiByteToWideChar(CP_UTF8, 0, string.c_str(), string.size(), &wstring[0], size_needed);
    return wstring;
}

我使用调试器来验证它是否有效。这是有效的:

调试器说wndClassEx.lpszClassName = L“Hello”

std::wstring str = WidenString("Hello");
wndClassEx.lpszClassName = str.c_str();

这不起作用:

调试器说wndClassEx.lpszClassName = L“وووووووووووووووووووووووووووووووووووووو

wndClassEx.lpszClassName = WidenString("Hello").c_str();

有人可以向我解释我的代码有什么问题吗?

1 个答案:

答案 0 :(得分:2)

WidenString()按值返回wstring。在第一个代码段中,wndClassEx.lpszClassName将指向有效的内存位置,只要变量str保留在范围内,即它不会被破坏。

在第二种情况下,返回值超出了表达式末尾的范围(;)和wndClassEx.lpszClassName然后指向无效的内存。