私の知識のほとんどは Windows 固有のものではないので、ご容赦ください。
ヒープとスタックはメモリ内の異なる領域を参照します (ただし、いずれの場合もメイン メモリについて話しているにすぎません)。これは特定の言語に限ったことではありません。ヒープは下位メモリ アドレスに存在し、上に向かって成長します。スタックは上位メモリ アドレスに存在し、下に向かって成長します。これは、それらが重ならないようにするためです (これは非常に悪いことです)。
32 ビット アーキテクチャでは、EBP および ESP レジスタが現在のスタック フレームを追跡します。EBP はベース ポインターです。これは、現在のスタック フレームの上位アドレスを指します。ESP はスタック ポインターであり、現在のスタック フレームの下位アドレスを指します。
解放/割り当て済みのヒープとスタック メモリの概念は、ほとんどがアプリケーション レベルに関係することに注意してください。マシン レベルでは、すべてのメモリは同じように見えます。使用中のメモリ セグメントを追跡するのは、プログラマ (またはコンパイラ) 次第です。
スタックは、関数を呼び出す命令と、EBP および ESP への明示的な変更の組み合わせによって管理されます。ESP を下回るものはすべて解放されたと見なされます。メモリを解放するには、ESP に追加するだけです。
ヒープはメモリ割り当て方法によって管理されます。ドキュメントはここにあります。Winows の詳細についてはよくわかりませんが、一般に、メモリのブロックが複数のアプリケーションに割り当てられていないことを確認する責任を持つメモリ マネージャがいくつかあります。