2017-01-09 2 views
0

Я пытаюсь показать простое сообщение в моем первом приложении 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 

Можете ли вы объяснить, почему этого поведения?

+0

Возможный дубликат [std :: string :: c \ _str() и временные] (http://stackoverflow.com/questions/10006891/stdstringc-str-and-temporaries) – IInspectable

ответ

4

Да, в первом примере wstring, созданная вызовом std :: to_wstring, имеет только область видимости. После выполнения строки она выходит за пределы области действия, и ее значение сомнительно.

Во втором примере wstring по-прежнему находится в области действия и действителен, и поэтому работает вызов .c_str().

Нет, другой ответ неверен. Посмотрите на реализацию c_str(). c_str() возвращает в основном LPCWSTR ... назовите его const WCHAR* или const wchar_t* или что угодно. Однако возврат c_str() относится к внутреннему указателю wstring. Проблема в том, что после выполнения строки кода wstring, возвращаемый с to_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++ с: cl.exe cstr.cpp

Если другой ответ правильный, то последняя строка должна иметь мусор или ничего не выводится, потому что, согласно другому ответу, c_str() является темпом. Но, если мой ответ правильный, то он должен вывести 1 (что он делает). Если все остальное не удается, посмотрите исходный код реализации.

+0

Спросите его, как ссылаться на временные wstring, созданный to_wstring(), если он все еще находится в области видимости. –

+1

@bit: [Время существования временного объекта] (http://en.cppreference.com/w/cpp/language/lifetime#Temporary_object_lifetime). – IInspectable

+0

@ Постоянный: большое спасибо. Сейчас все в порядке. Ты прав. Еще раз спасибо. – bit

Смежные вопросы