const char *Greet(const char *c) {
string name;
if(c)
name = c;
if (name.empty())
return "Hello, Unknown";
return name.c_str();
}
int _tmain(int argc, _TCHAR* argv[])
{
cout << Greet(0) << '\t' << Greet("Hello, World") << endl;
return 0;
}
Я вижу 2 ошибки с кодом выше.
Возвращение c_str из строкового объекта, определенного локально для функции. Строка уничтожается, когда функция возвращается, и очевидно, что c_str () будет указывать на некоторую память, которая была выделена.
Возвращение «Hello, Unknown» из функции. Это опять-таки массив константных символов, выделенных в стеке, которые также должны быть отменены при возврате функции. Тем не менее, это не так, и я предполагаю, что это из-за оптимизации возвращаемого значения.
Правильно ли мое понимание выше?
PS: я тестировал приведенный выше код как с gcc, так и с MSVC10. GCC прекрасно выполняет приведенный выше код и не генерирует никаких ошибок времени выполнения или неопределенного поведения как для строкового объекта, так и для константной строки. MSVC10 отображает данные мусора для строкового объекта, но печатает постоянную строку правильно.