Какую память использовать - зависит от обстоятельств. Иногда - проще локальные переменные все разместить на стеке и потом не думать ни о чем. Иногда - наоборот - стек сильно ограничен и все локальные переменные лучше разместить на куче, а потом освободить память при выходе из функции. Тут - умные указатели в помощь. Иногда вообще - память нужно выделять динамически по требованию, но если для выделения использовать alloca то и про нее можно не думать при выходе из функции - разве что - убедиться, что деструкторы объектов отработали.
Что такое "динамические переменные"? Это указатель на динамическую память? Выделение памяти при помощи new надо использовать тогда, когда это необходимо. Для автоматического освобождения динамической памяти удобно использовать "умные указатели" (std::unique_ptr и др.)