Предпочитайте объекты с ограниченным временем жизни; без необходимости не выделяйте память в куче
Причина
Объект с ограниченным временем жизни — это локальный объект, глобальный объект или член класса. Это означает отсутствие отдельных затрат на выделение и освобождение памяти сверх тех, что уже предусмотрены для содержащей области видимости или объекта. Члены объекта с ограниченным временем жизни сами имеют ограниченное время жизни, а конструктор и деструктор объекта управляют временем жизни его членов.
Пример
Следующий пример неэффективен (из-за лишних выделения и освобождения памяти), уязвим к исключениям и возвратам в части кода ... (что приводит к утечкам) и многословен:
void f(int n)
{
auto p = new Gadget{n};
// ...
delete p;
}
Вместо этого используйте локальную переменную:
void f(int n)
{
Gadget g{n};
// ...
}
Контроль
Исключение: не выдавать такое предупреждение для локального Unique_pointer на неограниченный массив.
- (Умеренный) Предупреждать, если объект выделяется и освобождается на всех путях выполнения внутри функции. Предлагать использовать локальный стековый объект.
- (Простой) Предупреждать, если локальный
Unique_pointerилиShared_pointer, не перемещённый, не скопированный, не переприсвоенный и не сброшенный черезresetдо конца своего времени жизни, не объявленconst.
Исключение
Если стековая память ограничена, допустимо создать локальный const unique_ptr<BigObject> для хранения объекта в куче вместо стека.