Это диагностическое правило основано на пункте R.5 CppCoreGuidelines (Prefer scoped objects, don't heap-allocate unnecessarily).
Память для хранения локальной переменной выделяется динамически и освобождается перед выходом из функции. В этом случае переменную можно разместить на стеке, чтобы избежать накладных расходов, связанных с выделением и освобождением памяти.
Пример:
class Object { .... }; void DoSomething() { auto obj = new Object; .... delete obj; }
Так как переменная существует только в рамках текущей области видимости, аллокацию памяти в большинстве случаев можно убрать.
Исправленный пример:
void DoSomething() { Object obj; .... }
Предупреждение не выдается, если выделенная память не освобождается, или в случаях утечки адреса наружу. На этом фрагменте кода указатель возвращают через выходной параметр функции:
void DoSomething(Object** ppObj) { auto obj = new Object; if (obj->good()) { *ppObj = obj; return; } delete obj; }