Большая часть моих знаний не зависит от Windows, поэтому терпите меня:
Куча и стек относятся к разным областям памяти (но мы все еще говорим о основной памяти в каждом случае). Это не относится ни к какому языку. Куча живет по малым адресам памяти и растет вверх; стек живет по старшим адресам памяти и растет вниз. Это сделано для того, чтобы они не перекрывались (что было бы очень плохо).
В 32-битной архитектуре регистры EBP и ESP отслеживают текущий кадр стека. EBP является базовым указателем - это указывает на высокий адрес текущего стекового кадра. ESP - это указатель стека, который указывает на низкий адрес текущего кадра стека.
Помните, что концепция свободной / выделенной памяти кучи и стека в основном актуальна на уровне приложений. На уровне машины вся память выглядит одинаково - программист (или компилятор) должен отслеживать, какие сегменты памяти используются.
Стек управляется комбинацией: инструкций, вызывающих функции, и явных модификаций EBP и ESP. Все, что ниже ESP, считается освобожденным; поэтому для освобождения памяти вы можете просто добавить в ESP.
Куча управляется методами выделения памяти; документацию можно найти здесь . Я не уверен в деталях Winows, но в целом будет какой-то менеджер памяти, который будет следить за тем, чтобы ни один блок памяти не был выделен более чем одному приложению.