我试图在我的第一个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
你能解释一下这种行为的原因吗?
答案 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(它确实如此)。如果所有其他方法都失败了,请查看实现源代码。