& quot; Важнейший const & quot; снова

Наткнулся ЭТОТ Пост Херба Саттера «снова», и я начал думать, почему то же самое не может быть справедливо и для константного указателя.

Вот тестовый код


const char* get()
{
std::string a("something");
return a.substr(1, a.size() - 3).c_str();
}

int main()
{
const char* str = get();
std::cout << str << std::endl;

return 0;
}

стандартная строка substr возвращает новый строковый объект. Компилирование с g++ -Wall также не дал мне никакой ошибки. Так показывает ли этот пример длительное временное поведение ИЛИ мне здесь просто повезло?

0

Решение

Правило гласит:
«Время жизни временной привязки к постоянная ссылка продолжается до жизни const. «

В вашем примере кода нет ссылки & это не связано с примером кода GOTW. Ваш код просто дает вам неопределенное поведение. В зависимости от того, как вы на это смотрите, вы можете считать себя счастливчиком / неудачником, что это работает.

Важная заметка:
Ссылки не указатели!

2

Другие решения

Нет, указатель на const делает не продлить срок службы временного.

Только при привязке временного к ссылка в const будет ли время жизни увеличено до времени жизни самой ссылки.

{
Foo factory();

const Foo& fooRef = factory();
const Foo* fooPtr = &factory();

fooRef.doSomething(); // OK
fooPtr.doSomething(); // UB, dangling pointer.
}
0

Вы можете представить, что std :: string просто что-то вроде этого:

class string {
const char *str_;
string(const char *str) {
str_ = new char[strlen(str)];
strcpy(str_, str);
}
~string() {
delete[] str;
}
const char *c_str() {
return str_;
}
}

Итак, после возврата из get () строка будет уничтожена и у вас будет указатель на мусор. Вы можете легко обнаружить эту ошибку с помощью valgrind или подобного инструмента.

0
По вопросам рекламы [email protected]