Здесь есть хороший вопрос:
"как это убедиться, что нет
конфликт между распределением стека и
выделение кучи? "
Практически во всех реализациях C / C ++ существует единое непрерывное адресное пространство, поэтому выделенная память для стека и кучи должна сосуществовать в этом пространстве.
Хотя каждый раз, когда стек увеличивается и уменьшается, это не делается с отдельными выделениями кучи, вы все равно можете думать о стеке как об одном большом блоке памяти, выделенном из кучи. Если размер стека выходит за границы этого блока, то мы имеем переполнение стека (броское имя ... кто-то должен назвать веб-сайт после него).
В многопоточной программе каждый раз, когда поток запускается, для него должен быть выделен новый стек, и когда поток умирает, этот стек может быть освобожден. И было бы целесообразно, чтобы эти блоки целого стека были распределены с использованием того же управления кучей, которое предоставляется через malloc
/ free
.
Итак, очень условно говоря, вы можете думать о стеке как о типе объекта, который сосуществует в куче. Весь стек malloc
-одан все за один раз, когда поток запускается, а затем он перераспределяется, а затем он получает free
-d за один раз.
В Windows вы можете (если вам нравится жить опасно) самостоятельно вызывать те же API виртуальной памяти , чтобы узнать о стеке и принудительно освободить виртуальную страницу в нем.