C での一時オブジェクトの破棄
関数呼び出しまたはコンストラクターへの値引数によって作成された一時オブジェクトがいつ破棄されるのか疑問に思う人もいるかもしれません。一時的に割り当てられたエンティティを含むコードが正しく実行されるかどうかを判断するには、それらの終了の正確なタイミングが重要です。
問題を説明するために、次の例を考えてみましょう。
#include <iostream> struct Foo { const char* m_name; ~Foo() { std::cout << m_name << '\n'; } }; int main() { Foo foo{"three"}; Foo{"one"}; // unnamed object std::cout << "two" << '\n'; }
このコードは " を出力しますか? 1 2 3"?必ずしもそうとは限りません。この動作は、C コンパイラとコンパイルに使用される特定の設定によって異なります。
C 標準 ([class.temporary] p4) によれば、一時オブジェクトの存続期間は、作成された完全な式が終了するまで続きます。提供された例では、完全な式が main 関数全体です。したがって、一時的な Foo オブジェクトの破棄は main の最後に発生し、これは観察された印刷シーケンスに従います。
ただし、[class.temporary] p5、p6、および p7 は、この一般規則に対するいくつかの例外を定義します。 。たとえば、配列の初期化における一時オブジェクトの有効期間が短くなる可能性があります。さらに、参照を一時オブジェクトにバインドするか、for-range-initializer で使用すると、その有効期間を延長できます。
結論として、C での一時オブジェクトの破棄の正確なタイミングは標準によって決まります。ほとんどの場合、テンポラリはそれを作成した式の最後に破棄されますが、特定の例外やコンパイラの最適化によってこの動作が変更される場合があります。これらのニュアンスを理解することは、正しく予測可能な C コードを記述するために不可欠です。
以上がC の一時オブジェクトはいつ破棄されますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。