Безопасен ли c_str() для конкатенированного строкового литерала?

Из этого ответа я знаю, что строковые литералы выделяются статически. Но безопасно ли использовать следующую конкатенацию строк?

void someFunction(std::string& foo) {
    functionTakingCString(("start " + foo + " end").c_str());
}

Дополнительный вопрос. Как указано в комментариях, это было бы действительно небезопасно, если бы functionTakingCString сохранял этот указатель. В этом случае будет ли справедливо следующее:

void someFunction(std::string& foo) {
    std::string bar = "start " + foo + " end";
    functionTakingCString(bar.c_str());
}

person PhilLab    schedule 19.01.2016    source источник
comment
Пока functionTakingCString не хранит этот указатель и что-то пытается использовать его за пределами времени жизни временного std::string.   -  person LogicStuff    schedule 19.01.2016
comment
спасибо за комментарий - я добавил дополнительный вопрос относительно вашего совета   -  person PhilLab    schedule 19.01.2016
comment
Срок службы bars в любом случае закончится на }, поэтому в ваших примерах это в основном та же проблема.   -  person Default    schedule 19.01.2016


Ответы (1)


Объединенная строка выделяется только во время работы functionTakingCString(("start " + foo + " end").c_str());. Затем память освобождается, и этот указатель становится небезопасным для использования, как вы можете прочитать здесь . Если этот указатель будет передан чему-либо, что запускается после выхода functionTakingCString, у вас возникнут проблемы.

person Flash_Steel    schedule 19.01.2016