ローカル スコープで「スタック上」に作成されたオブジェクトには、自動保存期間と呼ばれるものがあります。規格は次のように述べています。
C++03 3.7.2 自動保存期間
1/ 明示的に auto または register と宣言されたローカル オブジェクト、または明示的に static または extern と宣言されていないローカル オブジェクトは、自動ストレージ期間を持ちます。これらのオブジェクトのストレージは、それらが作成されたブロックが終了するまで続きます。
2/ [注: これらのオブジェクトは、6.7 で説明されているように初期化および破棄されます。]
これらのオブジェクトの破壊について:
6.7 宣言文
2/ 自動保存期間 (3.7.2) を持つ変数は、それらの宣言ステートメントが実行されるたびに初期化されます。ブロックで宣言された自動保存期間を持つ変数は、ブロックの終了時に破棄されます (6.6)。
したがって、標準によると、ローカル スコープを持つオブジェクトがスコープ外になると、デストラクタが呼び出され、ストレージが解放されます。
ストレージがスタック上にあるという天気かどうかは、標準では述べていません。どこにいても、ストレージが解放されたと言っているだけです。
一部のアーキテクチャには、PC と同じ意味でのスタックがありません。C++ は、あらゆる種類のプログラマブル デバイスで動作することを意図しています。そのため、スタック、ヒープなどについては何も言及されていません。
Windows とユーザー モード コードを実行する一般的な PC タイプのプラットフォームでは、これらの自動変数はスタックに格納されます。これらのスタックは固定サイズで、スレッドの開始時に作成されます。それらがインスタンス化されると、それらはスタック上のより多くのスペースを占有し、スタック ポインターが移動します。これらの変数を十分に割り当てると、スタックがオーバーフローし、プログラムは醜い死に方をします。
これを Windows PC で実行してみて、例で何が起こるかを確認してください。
int main()
{
int boom[10000000];
for( int* it = &boom[0]; it != &boom[sizeof(boom)/sizeof(boom[0])]; ++it )
*it = 42;
}