2015-06-04 3 views
3

я столкнулся следующий код (примерно):Lifetime временных объектов

struct StringBuffer { 
    StringBuffer(const char* string) {strcpy(m_buffer, string);} 
    const char* c_str() const {return m_buffer;} 
    char m_buffer[128]; 
}; 


std::string foobar() { 
    const char* buffer = StringBuffer("Hello World").c_str(); 
    return std::string(buffer); 
} 

Я правильно предполагая, что после строки:

const char* buffer = StringBuffer("Hello World").c_str(); 

buffer указывает на указатель в деконструкции StringBuffer объект?

ответ

7

Чтобы ответить на ваш вопрос в конце, да, buffer будет беспризорным указателем.

Чтобы ответить на более общий вопрос о жизни временных значений, я предлагаю вам прочитать this reference, который говорит:

... все временные конструкции разрушаются, как последний шаг в оценке полного выражения, что (лексический) содержит точку, в которой они были созданы ...

Что для вашего случая означает, что после выполнения задания buffer временный объект разрушен.

+0

Возможно, стоит упомянуть, что ссылка на константу может продлить срок службы временного. – Hurkyl

+0

@Hurkyl Перечислено как исключение на ссылочной странице, с которой я связан. –

+0

Да, я знал, что ссылка на const распространяется на всю жизнь, хорошая статья об этом здесь: http://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/также –

4

Да.

По соглашению, такие функции, как std :: string :: c_str(), не предназначены для кэширования, потому что, даже если он указывает на не временный объект, он может быть аннулирован перераспределением строки, которую он указывает к.