2016-05-05 11 views
0

自動保存期間を持つオブジェクトが通常のプログラムの一部として破棄される直前に呼び出される、コールバックを登録する標準(すべてのC++標準)終了?自動保存期間を持つオブジェクトが破棄される前に呼び出されるコールバック

編集:

これをより明確にする。これはマルチスレッドアプリケーションです。いくつかのオブジェクトは、それらを参照する(「ファンクタ」は「オリジネータ」オブジェクトにアクセスします)、スレッドプールにファンクタをプッシュした可能性があります。スレッドプールオブジェクトは静的なので、破棄されるの後にmain()が返されます。したがって、それらを参照しているファンクションをスレッドプールにプッシュしたこれらのオブジェクトはすべて既に破棄されています。終了時にスレッドプールがフラッシュされるため、ファンクタには "originator"オブジェクトへの参照がありません。

+1

デストラクタはどうですか? – user463035818

+0

はい、それぞれのクラスには独自のクラスがありますが、すべてがフックメカニズムをインストールする必要があります。非クラス型のオブジェクトはもちろんですが、 – user1095108

+0

オブジェクトが破棄されるたびに、プログラムの終了またはコールバックの前に単一のコールバックが必要ですか? – user463035818

答えて

2

のstd :: atexitをあなたが欲しいものを行う必要があります。

レジスタ機能ははstd ::終了()または/ CPP /言語からの復帰を経て(FUNCによって指され、通常のプログラムの終了時に呼び出されます主な機能)

http://en.cppreference.com/w/cpp/utility/program/atexit「あなたが同様のstd :: terminate_handlerに何かを置きたいと思うかもしれ

http://en.cppreference.com/w/cpp/error/terminate_handler

+1

いいえ、その時点では、 main()で割り当てられたもの – user1095108

+1

mainは特別ではありません - 関数内のすべての自動変数は、関数の終了時にクリーンアップされます。任意の関数が終了したときに何かを実行したい場合は、自明に行うことができます。 main()はプログラム終了の一部ではありません。静的変数のようなものを扱うのは難しいのですが、これが解決策です。 – xaxxon

+2

@ user1095108 'exit()'を明示的に呼び出すと、破壊されない。 –

関連する問題