Это диагностическое правило основано на пункте 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;
}