【问题标题】:MFC - Display messageMFC - 显示消息
【发布时间】:2017-01-09 16:13:12
【问题描述】:

我正在尝试在我的第一个 MFC 应用程序中显示一条简单的消息。

奇怪的是,第一个示例不起作用,而第二个示例却可以正常工作。

auto text = std::to_wstring(1).c_str();
MessageBox(text, NULL, 0); // Not ok, the message is empty

auto temp = std::to_wstring(1);
MessageBox(temp.c_str(), NULL, 0); // Ok, display 1

你能解释一下为什么会出现这种行为吗?

【问题讨论】:

标签: c++11 mfc


【解决方案1】:

是的,在第一个示例中,调用 std::to_wstring 创建的 wstring 仅具有该行的范围。行执行后,它超出了范围,它的值是可疑的。

在第二个示例中,wstring 仍在范围内且有效,因此对 .c_str() 的调用有效。

不,另一个答案是错误的。看c_str()的实现。 c_str() 基本上返回 LPCWSTR... 称它为 const WCHAR*const wchar_t* 或其他。但是,c_str() 的返回是指向 wstring 的内部指针。问题是这行代码执行后,to_wstring()返回的wstring无效,所以c_str()返回的指针是垃圾。为了好玩,试试下面的代码:

//cstr_.cpp
#include <iostream>
#include <string>

using namespace std;

int main(int argc, char* argv)
{
   auto temp = to_wstring(1).c_str();
   wprintf(L"%s\n", temp);

   auto temp2 = to_wstring(1);
   wprintf(L"%s\n", temp2.c_str());

   wstring ws = to_wstring(1);
   auto temp3 = ws.c_str();
   wprintf(L"%s\n", temp3);
}

我从 VC++ shell 提示符编译了上面的代码:cl.exe cstr.cpp

如果另一个答案是正确的,那么最后一行应该有垃圾或没有输出,因为根据另一个答案,c_str() 是一个临时值。但是,如果我的答案是正确的,那么它应该输出 1(它确实如此)。如果一切都失败了,请查看实现源代码。

【讨论】:

  • 问他如何引用to_wstring()创建的临时wstring,如果它还在范围内。
  • @IInspectable:非常感谢。现在好啦。你说的对。再次感谢您。
  • 我收回了。 to_wstring 确实返回一个临时的,它仍然有效,当调用 c_str() 时。后者的返回值在调用字符串上的非常量成员函数时无效,或者它被破坏。它是中间的暂时性,对观察到的行为负责。
  • 我有点困惑。如果我将 to_wstring 的结果分配给一个变量,然后我调用 c_str 以将其结果分配给另一个变量,那么,我将永远无法使用从 c_str 返回的值。为什么?对象字符串没有超出范围!我无法理解
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多