MFC - 显示消息

时间:2017-01-09 16:13:12

标签: c++11 mfc

我试图在我的第一个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

你能解释一下这种行为的原因吗?

1 个答案:

答案 0 :(得分:4)

是的,在第一个示例中,通过调用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(它确实如此)。如果所有其他方法都失败了,请查看实现源代码。