【问题标题】:Strange Results when converting int to LPCTSTR with sstream使用 sstream 将 int 转换为 LPCTSTR 时出现奇怪的结果
【发布时间】:2015-05-15 20:01:20
【问题描述】:

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

抱歉,如果我是愚蠢的,感谢您的帮助!

【问题讨论】:

    标签: c++ winapi mfc


    【解决方案1】:

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

    【讨论】:

    • 明白了,你建议如何解决这个问题?
    • @LJPark 尽可能使用std::wstring,在真正需要之前不要获取指针。所以你有一个Int32ToWstring 函数,而不是Int32ToLPCTSTR 函数,它按值返回一个字符串。然后你可以做例如Int32ToWstring(3).c_str() 代替。
    【解决方案2】:

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

    std::wstring 函数c_str() 返回一个指向字符串内部缓冲区的指针。该指针仅在字符串本身保持有效(且未修改)时才有效。

    这意味着res 在其初始化结束后立即变得悬空。

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

    更好的是,我建议你完全放弃使用TCHAR。您曾经要为单字节字符串或多字节字符串构建应用程序吗?我认为不会,在这种情况下,您可以简单地使用std::wstringwchar_t 和相应的函数,让您的生活更轻松。

    【讨论】:

      猜你喜欢
      • 2020-01-08
      • 1970-01-01
      • 2017-03-16
      • 1970-01-01
      • 1970-01-01
      • 2013-09-26
      • 2016-12-20
      • 2015-01-18
      • 2015-11-19
      相关资源
      最近更新 更多