Не обращайтесь к объекту за пределами времени его жизни
Доступ к обоъекту за пределами времени его жизни - неопределенное поведение.
Начало времени жизни:
- Для объектов с тривиальной инициализацией: когда выделена память подходящего размера и выравнивания
- Для объектов с нетривиальной инициализацией: когда конструктор завершает выполнение
Конец времени жизни:
- Для объектов с тривиальным деструктором: когда память освобождается или переиспользуется
- Для объектов с нетривиальным деструктором: когда начинается выполнение деструктора
Категории времени жизни:
- Автоматическое (automatic storage duration)
void func() {
int x = 42; // начало: при выполнении объявления
} // конец: при выходе из области видимости
- Статическое (static storage duration)
- Динамическое (dynamic storage duration)
- Потоковое (thread storage duration)
Соблюдайте следующие рекомендации:
- Никогда не возвращайте ссылки/указатели на локальные объекты
Неправильно:
Правильно:
- Проверяйте указатели, включая умные, на валидность
Неправильно:
Правильно:
- При освобождении сырых указателей, зануляйте их, если указатель может быть повторно использован
Неправильно:
Правильно: