1

重複の可能性:
C ++はグローバル変数とクラス静的変数のデストラクタを呼び出しますか?

の寿命は何ですか

  • グローバルMyClass myclass;
  • グローバルstatic MyClass myclass;
  • グローバルconst MyClass myclass;
  • グローバルstatic const MyClass myclass;
  • static MyClass myclass;初期化が実際に行われたときにローカル関数
  • static constexpr MyClass myclass;C++11でグローバル

特に、通常のプログラム終了時に破棄されますか(つまりmain、エラーなしで残されます)?標準はどこにそう述べていますか。

プライベートデストラクタがこれらすべての変数の作成を妨げていることに気づきました。しかし、私が正しく覚えていれば、静的データの一部が静的データセクションに配置され、事前に構築されてロードされる可能性があることがどこかで明示的に言及されていました。これは、デストラクタが呼び出されないことを意味します。そして、これは私がそのような変数を定義することを許可されていることを意味します...

4

2 に答える 2

6

constexpr静的な存続期間を持つオブジェクトのデストラクタ(言及したすべてのケースで静的な存続期間を持つオブジェクトを定義します。ただし、a内のオブジェクトが重要なデストラクタを持つことはできないと思います)はexit()、オブジェクトの逆の順序で内部から呼び出されます。建設されました。

fromから戻ると、戻り値で呼び出されるため、mainから戻ると、これらのデストラクタが呼び出されますmainexitプログラム終了の他の手段(abort()、アサーションの失敗_exit()など)は、デストラクタを呼び出しません。

オブジェクトがDLL内にある場合(.soUnixの場合)、通常、DLLがアンロードされるときにデストラクタが呼び出されます。

于 2012-10-04T13:58:29.487 に答える
4

ファイルまたは名前空間スコープオブジェクトのデストラクタは、制御フローが終了したときに呼び出されますmain()

例外が残った場合、そのmain()実装は、オブジェクトのデストラクタが呼び出されるかどうかを定義します。最新のコンパイラでは、この場合、未処理の例外がスローされたときにプログラムの状態を簡単に検査できるようにするために、デストラクタは呼び出されません。setjmp初期のC++実装では、 /に基づく例外メカニズムが使用されてlongjmpいました。これは、例外ハンドラーの検索中にスタックを巻き戻し、適切な例外ハンドラーが最終的に見つからなかった場合でもデストラクタを呼び出します。

アプリケーションがデストラクタで終了した場合、_exit()またはデストラクタが呼び出されなかった_Exit()場合。std::quick_exit()

于 2012-10-04T13:43:07.770 に答える