我已声明以下方法将整数转换为LPCTSTR以便在MFC应用程序中使用。
LPCTSTR CTCPServerDlg::Int32ToLPCTSTR(int i32) {
std::wostringstream ss;
ss << i32;
LPCTSTR res = ss.str().c_str();
MessageBox(ss.str().c_str()); // Correctly shows value.
MessageBox(res); // Nothing shown.
return res;
}
如上所述,第一个消息框正确显示了我传入i32参数的整数。第二个消息框什么都不显示(或者我假定不可见的字符)。当调用这样的函数时:
MessageBox(Int32ToLPCTSTR(3));
我得到一些奇怪的性格。我认为这是中国的象征。我理解在Windows中使用不同类型的Unicode和ANSI会让我们最好的人混淆,但ss.str()。c_str()的返回值应该正确分配给我声明的LPCTSTR res变量吗?此外,当尝试将创建的LPCTSTR插入到CEdit控件中时,我会得到更多未知的汉字,这些都与以前不同。
道歉,如果我是愚蠢的,请帮助赞赏!
答案 0 :(得分:1)
res
是一个悬空指针。 str()
wostringstream
函数按值返回新的std::wstring
。这意味着它是临时的。
std::wstring
函数c_str()
返回指向字符串内部缓冲区的指针。只要字符串本身保持有效(并且未经修改),该指针才有效。
这一起意味着res
一旦初始化结束就会变得悬空。
您的功能的整个界面看起来有缺陷。要返回LPCTSTR
,它必须为返回的字符串分配内存。但这意味着你将返回一个指向动态分配内存的原始指针,这会导致泄漏,双删除错误等。只需更改函数即可返回std::wstring
(或_tstring
如果< em>真的想继续使用TCHAR
)。然后,您可以在必要时通过致电LPCTSTR
获取c_str()
。
更好的是,我建议你完全放弃使用TCHAR
。您是否曾为单字节字符串或多字节字符串构建应用程序?我假设没有,在这种情况下,您可以简单地使用std::wstring
,wchar_t
以及相应的功能,让您的生活更轻松。
答案 1 :(得分:0)
ss.str()
返回的字符串按值返回 ,如果你不存储它,那么它是临时的,一旦表达式完成就会被破坏,留下一个指针到不再存在的字符串。当你试图取消引用那个迷路指针时,这当然会导致undefined behavior。