使用sstream将int转换为LPCTSTR时的奇怪结果

时间:2015-03-13 10:59:45

标签: c++ winapi mfc

我已声明以下方法将整数转换为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控件中时,我会得到更多未知的汉字,这些都与以前不同。

道歉,如果我是愚蠢的,请帮助赞赏!

2 个答案:

答案 0 :(得分:1)

res是一个悬空指针。 str() wostringstream函数按值返回新的std::wstring 这意味着它是临时的。

std::wstring函数c_str()返回指向字符串内部缓冲区的指针。只要字符串本身保持有效(并且未经修改),该指针才有效。

这一起意味着res一旦初始化结束就会变得悬空。

您的功能的整个界面看起来有缺陷。要返回LPCTSTR,它必须为返回的字符串分配内存。但这意味着你将返回一个指向动态分配内存的原始指针,这会导致泄漏,双删除错误等。只需更改函数即可返回std::wstring(或_tstring如果< em>真的想继续使用TCHAR)。然后,您可以在必要时通过致电LPCTSTR获取c_str()

更好的是,我建议你完全放弃使用TCHAR。您是否为单字节字符串或多字节字符串构建应用程序?我假设没有,在这种情况下,您可以简单地使用std::wstringwchar_t以及相应的功能,让您的生活更轻松。

答案 1 :(得分:0)

ss.str()返回的字符串按值返回 ,如果你不存储它,那么它是临时的,一旦表达式完成就会被破坏,留下一个指针到不再存在的字符串。当你试图取消引用那个迷路指针时,这当然会导致undefined behavior