2016-12-20 13 views
1

я сталкивался несколькими экземплярами этой модели (с буст :: файловая система используется только в качестве примера):Lifetime возвращенных строк и их .c_str()

boost::filesystem::path path = ...; 
someFunctionTakingCStrings(path.string().c_str()); 

где

const std::string path::string() const 
{ 
    std::string tmp = ... 
    return tmp; 
} 

Хотя я никогда не испытывал проблем с этим шаблоном, мне было интересно, когда строка, возвращаемая sting(), будет уничтожена и будет ли код, обращающийся к c_str(), безопасным как c_str() lifetime is bound to std::string lifetime.

+0

Почему это помечено как вопрос? – wasthishelpful

+0

Потому что у него есть c_str() в нем – PhilLab

+2

@PhilLab: но это не значит, что он будет * компилировать * в C ;-) – Bathsheba

ответ

2

someFunctionTakingCStrings(path.string().c_str()); безопасен, поскольку стандарт гарантирует, что срок службы анонимного временного path.string() сохранится при вызове функции. Таким образом, указатель, возвращаемый c_str(), является допустимым параметром для someFunctionTakingCStrings.

const std::string path::string() const является безопасным, так как концептуально, вы возвращаете значение копию tmp, хотя на практике компилятор оптимизирует из копии значения (процесс, называемый оптимизации имени возвращаемого значения).

Нечто подобное const std::string& path::string() const с одной и той же функции тела, как тот, который вы бы не быть определены (так как ссылка будет свисают) и

const char* ub_server() 
{ 
    std::string s = "Hello"; 
    return s.c_str(); 
} 

также не определено, так как s вне к моменту возврата функции.

Наконец, обратите внимание, что использование указателя на анонимное временное значение в качестве параметра в вызове функции: не разрешено в стандартном C++, хотя досадно, Visual C++ разрешает его как расширение.

+0

спасибо. Быстрое наблюдение: Итак, '' functionTakingPointer (& path.string()) '' также будет безопасным? – PhilLab

+0

@PhilLab: Нет, это небезопасно в стандартном C++. Я поставил это в конце ответа. – Bathsheba

+0

hm, то я не понял всю жизнь path.string() полностью. Или анонимные временные целые главы по управлению памятью? – PhilLab

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

  • Нет связанных вопросов^_^