Какую память использовать - зависит от обстоятельств. Иногда - проще локальные переменные все разместить на стеке и потом не думать ни о чем. Иногда - наоборот - стек сильно ограничен и все локальные переменные лучше разместить на куче, а потом освободить память при выходе из функции. Тут - умные указатели в помощь. Иногда вообще - память нужно выделять динамически по требованию, но если для выделения использовать alloca то и про нее можно не думать при выходе из функции - разве что - убедиться, что деструкторы объектов отработали.