2017-01-09 19 views
0

私は最初のMFCアプリケーション内に単純なメッセージを表示しようとしています。MFC - メッセージを表示

不思議なことに、最初のサンプルが正しく動作せず、2番目のサンプルが正しく動作します。

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

[std :: string :: c \ _str()とtemporaries]の複製があります(http://stackoverflow.com/questions/10006891/stdstringc-str-and-temporaries) – IInspectable

答えて

4

はい、最初の例では、std :: to_wstringの呼び出しで作成されたwstringには行のスコープしかありません。行が実行された後、それは範囲外であり、その値は疑わしいです。

2番目の例では、wstringは有効範囲内で有効なので、.c_str()の呼び出しが機能します。

いいえ、他の回答は間違っています。 c_str()の実装を見てください。 c_str()は、基本的にLPCWSTRを返します。const WCHAR*またはconst wchar_t*などとなります。しかし、c_str()の返り値は、wstringの内部ポインタです。問題は、コード行が実行された後、to_wstring()から返されたwstringが無効であるため、c_str()によって返されたポインタがガーベジであることです。私はVC++シェルプロンプトから上記をコンパイルし

//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); 
} 

:cl.exeのcstr.cpp

他の答えが正しい場合は、最後の行がゴミを持つべき楽しみのために、次のコードを試してみてくださいまたは何も出力しません。なぜなら、他の答えによれば、c_str()は一時的なものです。しかし、私の答えが正しければ、それは1を出力しなければなりません(それはあります)。他のすべてが失敗した場合、実装のソースコードを見てください。

+0

一時的な参照方法を教えてくださいスコープ内にまだ存在する場合、to_wstring()によって作成されたwstring。 –

+1

@bit:[一時的なオブジェクトの存続期間](http://en.cppreference.com/w/cpp/language/lifetime#Temporary_object_lifetime)。 – IInspectable

+0

@IInspectable:ありがとうございました。今は大丈夫です。あなたが正しいです。ありがとうございました。 – bit

関連する問題