ホームページ >バックエンド開発 >C++ >C ではオブジェクトはどのように破棄されるのでしょうか?

C ではオブジェクトはどのように破棄されるのでしょうか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-10 09:45:12647ブラウズ

How Are Objects Destroyed in C  ?

C でのオブジェクトの破棄

スコープ付きオブジェクト

自動オブジェクト: 外側のスコープが指定されている場合、定義の逆の順序で破棄されます。
非ローカル静的オブジェクト: メイン (グローバル変数、静的メンバー データ) の実行後、定義とは逆の順序で破棄されます。
ローカル静的オブジェクト: 制御フローが最初に定義を渡したときに構築され、破棄されますmain (関数内の静的変数) の実行後に逆の順序で。

基本クラスとメンバーサブオブジェクト:**

定義とは逆の順序で、最初のメンバー サブオブジェクト、次に基本クラスのサブオブジェクトで破棄されます。

配列要素:**

降順で破棄されます。 n 番目の要素の構築中に例外が発生した場合、要素 n-1 から 0 が最初に破棄されます。

一時オブジェクト:**

クラス型の prvalue 式が評価されるときに構築されます。含まれる式の評価が完了すると破棄されます。評価中に例外が発生した場合、一時オブジェクトは正しく破棄されます。

動的オブジェクトと配列:**

動的オブジェクト: new Foo で割り当てられ、delete p で破棄されます。 .
動的配列: 割り当て済みnew Foo[n] で削除し、delete[] p で破棄します。

どちらの場合も、メモリを複数回破棄しようとしたり、破棄後にアクセスしたり、間違った破棄メカニズムを使用したりしています (例: 単一オブジェクトの delete[])。 ) 未定義の動作が発生します。構築中に例外が発生した場合、動的に割り当てられたメモリは例外が伝播する前に解放されます。

Reference-Counting Smart Pointers:**

std::shared_ptr: 最後の std::shared_ptr として管理オブジェクトを破棄します。それを参照しているオブジェクトは破棄されます。

例外動作:

デストラクターはプログラムを終了する可能性があるため、例外をスローしてはなりません。オブジェクトの破棄中に例外が発生した場合、その例外は伝播され、以前に破棄されたサブオブジェクトはすべて正しく破棄されます。ただし、構築中に動的オブジェクトの例外が発生した場合、例外が伝播する前にメモリが解放され、オブジェクトのデストラクターは呼び出されません。

以上がC ではオブジェクトはどのように破棄されるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。