Spec-Zone.ru › GCC 7

13.7.3 Временные объекты могут исчезнуть раньше, чем ожидается

Опасно использовать указатели или ссылки на части временного объекта. Компилятор может удалить объект гораздо раньше, чем ожидается, оставив указатель на мусор. Эта проблема чаще всего возникает в классах, подобных строковым классам, особенно в тех, которые определяют функцию преобразования в тип char * или const char * — это одна из причин, почему стандартный класс string требует вызова метода c_str. Однако любой класс, возвращающий указатель на внутреннюю структуру, потенциально подвержен этой проблеме.

Например, программа может использовать функцию strfunc, которая возвращает объекты string, и другую функцию charfunc, которая работает с указателями на char:

string strfunc ();
void charfunc (const char *);

void
f ()
{
  const char *p = strfunc().c_str();
  …
  charfunc (p);
  …
  charfunc (p);
}

В этой ситуации может показаться разумным сохранить указатель на строку C, возвращаемую методом c_str, и использовать её вместо многократного вызова c_str. Однако временная строка, созданная при вызове strfunc, уничтожается после инициализации p, в результате чего p указывает на освобождённую память.

Код такого рода может работать успешно под некоторыми другими компиляторами, особенно устаревшими компиляторами на базе cfront, которые удаляют временные объекты вместе с обычными локальными переменными. Однако поведение GNU C++ соответствует стандарту, поэтому, если ваша программа зависит от позднего уничтожения временных объектов, она не будет переносимой.

Безопасный способ написания такого кода — дать временному объекту имя, что заставляет его оставаться до конца области видимости имени. Например:

const string& tmp = strfunc ();
charfunc (tmp.c_str ());

Далее: Копирование присваивания, Предыдущее: Поиск имён, Вверх: Ошибки в понимании C++ [Содержание][Индекс]

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-7.5.0/gcc/Temporaries.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API