Стек и куча это области оперативной (изменяемой) памяти.
Кстати есть еще память типа static.
Память на стеке это локальные переменные в функции. Входим в функцию локальные переменные создаются в стеке, выходим из функции переменные исчезают. Причем их не надо удалять, просто следующий вход в следующую функцию затирает ранее присвоенные данные ячейкам памяти в стеке и все.
И это главный плюс памяти на стеке, в том что не надо беспокоится об ее освобождении. Компилятор на этапе компиляции и сборки сам создает и уничтожает локальные переменные
В отличии от памяти на стеке память в куче (new Cpp) (malloc,C) надо обязательно подчищать за собой своим кодом (delete Cpp , free C).
И как часто бывает это не всегда происходит. Отсюда и происходят утечки памяти.

Память на стеке и в куче объединяет то, что это по сути одна область памяти с тем нюансом, что начало стека и кучи начинаются на противоположных краях памяти и растут навстречу друг другу.
Есть еще другие области памяти, но они так сказать фиксированные:
1.память команд (не изменяемая)
2. изменяемая фиксированная память, она же инициализированная и не инициализированная память, она же глобальная память и там же как часть статическая память.