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

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

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-23 07:31:10583ブラウズ

When and How Are Objects Destroyed in C  ?

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

C では、さまざまなコンテキストでオブジェクトの作成と破棄が可能になります。これらの操作がいつどのように発生するかを理解することは、効果的なリソース管理とメモリ リークの回避にとって重要です。

スコープ指定されたオブジェクトの破棄

自動オブジェクト (ローカル変数):
自動オブジェクトは、制御フローがそのスコープ (関数、ブロックなど) を出るときに、その定義とは逆の順序で破棄されます。関数の実行中に例外がスローされた場合、自動オブジェクトは例外が伝播される前に破棄されます。 重要な注意事項: 自動オブジェクトのデストラクターは例外をスローしてはいけません。

非ローカル静的オブジェクト (グローバル変数):
名前空間スコープで定義された静的オブジェクトはmain() の実行後に、定義とは逆の順序で破棄されます。例外が静的オブジェクトのデストラクターから出る場合、std::terminate が呼び出されます。

ローカル静的オブジェクト:
関数内で定義された静的オブジェクトは、制御フローがその定義に入るときに構築されます。初めて。これらは main() の実行後に定義とは逆の順序で破棄されます。繰り返しますが、それらのデストラクタは例外をスローすべきではありません。

基本クラスのサブオブジェクトとメンバー サブオブジェクト:
メンバー サブオブジェクトは定義の逆の順序で破棄され、続いて基本クラスのサブオブジェクトが定義の順序で破棄されます。ベース指定子リスト。サブオブジェクトの構築中に例外が発生すると、例外が伝播される前に、以前に構築されたすべてのサブオブジェクトが破棄されます。デストラクターは、ファイルやソケットなどのリソースを解放します。

配列要素の破棄:**

配列要素は降順で破棄されます。要素の構築中に例外が発生すると、例外を伝播する前に、以前に構築された要素が破棄されます。

一時オブジェクト:**

一時オブジェクト (prvalue 式の評価中に作成される) は、完全な式が終了すると破棄されます。評価されました。一時オブジェクトの評価中に例外が発生すると、以前の一時オブジェクトが適切に破棄されます。ローカル参照が prvalue で初期化される場合、一時オブジェクトの有効期間は参照のスコープまで延長され、ダングリング参照が防止されます。

動的オブジェクトと配列の破棄

動的オブジェクト (ポインター) :
new で作成された動的オブジェクトは、delete で破棄されます。複数回の破棄、破棄されたオブジェクトへのアクセス、または不適切な手段 (delete[] など) による破棄は、未定義の動作を引き起こします。動的オブジェクトの構築中に例外が発生すると、例外の伝播前にメモリが解放されます。

動的配列:
new[] で作成された動的配列は、delete[] で破棄されます。複数の破壊、不適切な破壊手段、および破壊後のアクセスにより、未定義の動作が発生します。配列要素の構築中に例外が発生すると、以前に構築された要素が破棄され、メモリが解放されます。

参照カウント スマート ポインター:
std::shared_ptr によって管理される動的オブジェクトは、オブジェクトを共有している最後のshared_ptrオブジェクトは破棄されます。スマート ポインターを使用すると、メモリ リークを防止し、適切なクリーンアップを確実に行うことができます。

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

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