This question already has answers here:
Guaranteed lifetime of temporary in C++?
(5个答案)
6年前关闭。
我目前正在执行DirectX11,并尝试将UTF8字符串转换为LPCWSTR。我编写了一个实用程序函数来帮助我进行转换:
我已经使用调试器来验证它是否有效。这正在工作:
调试器说wndClassEx.lpszClassName = L“Hello”
这不起作用:
调试器说wndClassEx.lpszClassName = L“ﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮ ...”
有人可以向我解释我的代码有什么问题吗?
(5个答案)
6年前关闭。
我目前正在执行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();
有人可以向我解释我的代码有什么问题吗?
最佳答案
WidenString()
按值返回wstring
。在第一个代码段中,只要变量wndClassEx.lpszClassName
保留在作用域内,即不被销毁,str
将指向有效的内存位置。
在第二种情况下,返回值确实超出了表达式末尾的范围(在;
处),然后wndClassEx.lpszClassName
指向无效的内存。
10-02 21:33