Почему я не могу использовать вывод строки из функции без создания строковой переменной? - PullRequest
0 голосов
/ 03 ноября 2018

У меня есть код, который работает правильно:

#include <iostream>

std::string func()
{
    return "string";
}

int main()
{
    std::string str = func();
    std::cout << str << std::endl;
    return 0;
}

Но когда я изменяю основную функцию на эту, у меня нет выхода:

int main()
{
    const char* c = func().c_str();
    std::cout << c << std::endl;
    return 0;
}

Эта основная функция работает нормально:

int main()
{
    std::string str = func();
    const char* c = str.c_str();
    std::cout << c << std::endl;
    return 0;
}

Я использую многобайтовое кодирование в Visual Studio.

1 Ответ

0 голосов
/ 03 ноября 2018

Итак, ваш второй экзамен - Неопределенное поведение из-за доступа к освобожденной памяти. Все может случиться.

func() возвращает временное std::string, время жизни которого заканчивается в конце полного выражения, превращая c в висячий указатель:

const char* c = func().c_str();

Противопоказано использование висящего указателя, особенно разыменования:

std::cout << c << std::endl;

Первый пример позволяет избежать этого, сохраняя возвращаемое значение в переменной и печатая его.
В-третьих, также сохраняя возвращаемое значение в переменной, даже если тогда он по какой-то непостижимой причине использует указатель на принадлежащую последовательность для вывода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...