9

C++ は、ブロックが正常に終了する (制御が失敗する) か、例外がスローされるかに関係なく、ブロック内のすべてのローカル変数のデストラクタを逆の順序で自動的に呼び出します。

スタックの巻き戻しという用語は後者にのみ適用されるようです。ローカル変数の破棄に関して、前者のプロセス (ブロックの通常の終了) はどのように呼び出されますか?

4

6 に答える 6

5

オブジェクトが「範囲外」になると、オブジェクトは自動的に破棄されます。これは「自動ストレージ再利用」と呼ばれることもありますが、実際にはガベージ コレクションを指しています (ガベージ コレクションを意味する用語を使用している名前にその語句が含まれる論文がいくつかあります)。オープン/クローズ、ロック/アンロック、またはその他の形式のリソース取得と適切なリリースとの適切なペアリングを保証するために使用される場合、これは Resource Acquisition is Initialization (RAII) の設計パターンとして知られています RAII の主な側面は、リソースの初期化や取得ではなく、その破棄です。

于 2010-04-09T05:58:59.320 に答える
3

スタックの巻き戻しは、これらの両方のケースで発生します。通常の実行では、実行中のメソッドが戻る (またはブロックが終了する) ときに、呼び出し元のメソッド (またはブロック) のコンテキストにのみスタックが巻き戻されます。ローカル変数はスタックに割り当てられるため、割り当てとは逆の順序でクリーンアップされます。このプロセスを巻き戻しと呼びます。これは、LIFO 構造に保存する他のタイプのデータ (元に戻す、やり直すなど) を処理するのと同じです。

例外がスローされると、ハンドラーは、例外をキャッチできるメソッドが見つかるまで、またはスタックの一番上に到達するまで、0 個以上のメソッドを介してスタックをアンワインドし、その時点で未処理の例外ハンドラーが呼び出されます。

例外処理の場合にのみスタックの巻き戻しという用語を使用するのが慣例のようですが、これらの各ケースで発生する同じプロセスです。メソッドが終了したためにスタックが巻き戻される特定のケースは、戻りと呼ばれます。コードのスコープブロックが終了したときに何が起こるかを命名するための規則はないようです。

于 2010-04-09T06:37:02.700 に答える
2

ローカル変数は、スコープ外になると破棄されます。その過程を「範囲外」と呼んでいるのではないでしょうか?

于 2010-04-09T05:58:38.310 に答える
1

これに名前があるかどうかはわかりません。スタック変数は非常に自動であるため、誰もそれらについて心配することはなく、この自動クリーンアップ プロセスに名前を付けるほどではありません。

「範囲外」とでも言いましょうか。

于 2010-04-09T05:58:58.273 に答える
1

auto「範囲外になる」、より正確には「変数が範囲外になる」とよく言われます。

于 2010-04-09T05:59:11.327 に答える
1

あなたが求めているのは、メソッド呼び出しが実際に機械語でどのように実装されているかということであれば、使用される呼び出し規約に依存すると思います

于 2010-04-09T06:22:03.163 に答える