問題タブ [atexit]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
iphone - これは決定的な参照カウントの目的の C シングルトン実装ですか?
これは、シングルトンの文献を熟読した後、私が作成したものです。私は何かを忘れましたか?
c - atexit コマンドを取り消したり削除したりできますか?
終了スタックに置くatexit( fn );
と、プログラムが終了したときに実行されます: return frommain()
または via exit()
.
スタックから削除できますか?
なぜ私はこれをしたいのですか?
atexit
、setjmp
およびを使用して、単純な try-catch メカニズムを試していましたlongjmp
。undo-atexit(fn);
最後に登録された関数でしか機能しない場合でも、できれば完璧です。
編集:
モノセレスの提案に従って、独自のスタックを作成します...
現在、スタックは 1 つの例外キャッチャーでのみ機能します。
python - Python プロセスは atexit を呼び出さない
で使用しようとしていますatexit
がProcess
、残念ながら機能していないようです。コード例を次に示します。
このコードの出力は次のとおりです。
W.run.log_terminate()
とが呼び出されたときa.terminate()
にが呼び出され、出力が次のようになることを期待しb.terminate()
ます (強調を追加)!:
なぜこれが機能しないのですか? また、 aが終了Process
したときに (コンテキストから)メッセージをログに記録するより良い方法はありますか?Process
ご意見をお寄せいただきありがとうございます。
解決
編集: Alex Martelli によって提案された解決策に基づいて、次は期待どおりに機能します。
atexit
ドキュメントの次のコメントに注意してください。
注: このモジュールを介して登録された関数は、プログラムがシグナルによって強制終了されたとき、Python の致命的な内部エラーが検出されたとき、または os._exit() が呼び出されたときに呼び出されません。
python - atexit での他のモジュールの参照
プログラムの終了時に子プロセスを強制終了する機能があります。
ただし、この関数が呼び出されるとエラー メッセージが表示されます。
os
とsignal
モジュールatexit
が呼び出される前にアンロードされるようです。それらを再インポートすると問題は解決しますが、この動作は奇妙に思えます。これらのモジュールはハンドラーを登録する前にインポートされるのに、なぜ自分の終了ハンドラーが実行される前にアンロードされるのでしょうか?
python - 他のスクリプトから呼び出されたときに機能する python atexit モジュールの代替
atexit.register(function)
Python スクリプトの終了時に呼び出される関数を登録するためにを使用することは、一般的な方法です。
問題は、これが醜い方法で失敗するケースを特定したことです。スクリプトが別の python スクリプトから実行された場合、execfile()
.
この場合、Python は終了時に関数を見つけることができないことがわかります。これは理にかなっています。
私の質問は、この問題が発生しない方法でこの機能を維持する方法です。
python - python 2.6.x のスレッド化 / シグナル /atexit は一部のバージョンで失敗しますか?
これに関連する多くの質問を見てきました...しかし、私のコードはpython 2.6.2で動作し、python 2.6.5では動作しません。シグナルをキャッチしてから正常に終了するため、「このモジュールを介して登録された関数は、プログラムがシグナルによって強制終了されたときに呼び出されない」という atexit 全体がここでカウントされるべきではないと考えるのは間違っていますか? 何が起きてる?これを行う適切な方法は何ですか?
パイソン 2.6.2:
パイソン 2.6.5:
2.6.5 のメイン スレッドは、atexit 関数を実行しないようです。
c++ - dlclose() は、グローバル オブジェクトのデストラクタを呼び出しません。
plugin1.cpp:
ホスト.cpp
ビルドして実行:
TestStatic::~TestStatic が「dlclose()」ではなく「exit()」で呼び出されるのはなぜですか?
python - Python: クロージャーとクラス
atexit
クラスで使用する関数を登録する必要があります (Foo
例については以下を参照)。残念ながら、メソッド呼び出しを介してクリーンアップする直接的な方法はありません: 私が制御できない他のコード、呼び出しFoo.start()
、Foo.end()
しかしエラーが発生した場合に呼び出されFoo.end()
ないことがあるので、自分でクリーンアップする必要があります。
このコンテキストでのクロージャーに関するアドバイスを使用できます。
クロージャーは適切に機能しますか? たとえば、 で
do_cleanup
、self の値は正しくバインドされていますか?atexit() ルーチンの登録を解除するにはどうすればよいですか?
これを行うより良い方法はありますか?
編集:これはPython 2.6.5です
c# - 混合モードC++/ CLIのクラッシュ:atexitでのヒープの破損(静的デストラクタ登録)
私はプログラムのデプロイに取り組んでおり、コードベースはC ++ / CLIとC#の混合物です。/clr
C ++ / CLIには、ネイティブ、混合( )、セーフ( )のすべての種類があります/clr:safe
。私の開発環境では、すべてのC ++ / CLIコードのDLLを作成し、それをC#コード(EXE)から参照します。この方法は問題なく機能します。
単一の実行可能ファイルをリリースしたい私のリリースの場合(単に「DLLとEXEを別々にしないのはなぜですか?」というだけでは受け入れられません)。
これまでのところ、すべての異なるソースを使用してEXEをコンパイルすることに成功しました。ただし、実行すると、[オンラインで確認]、[閉じる]、[デバッグ]のオプションが表示された[XXXXが動作を停止しました]ダイアログが表示されます。問題の詳細は次のとおりです。
デバッグしてVisualStudioに送信すると、次のように報告されます。
breakを選択すると、追加情報なしでntdll.dll!77d2dc9b()で停止します。Visual Studioに続行するように指示すると、プログラムは正常に起動し、問題なく動作しているように見えます。これは、おそらくデバッガーが接続されているためです。
これをどう思いますか?このヒープの破損を回避するにはどうすればよいですか?プログラムはこれを除いて正常に動作しているようです。
私の要約されたコンパイルスクリプトは次のとおりです(簡潔さのためにエラーチェックを省略しました):
アップデート1
これをデバッグシンボルでコンパイルして再試行すると、実際にはより多くの情報が得られます。コールスタックは次のとおりです。
これ(の動的初期化子)を'引き起こす'私のコードの行Bytes::Null
は次のとおりです。
次のように宣言されているヘッダー内:
また、次のようにヘッダーでグローバル外部変数を実行してみました。
同じように失敗しました。
atexit
静的初期化子のために不注意に必要とされているCRT関数が原因であるようです。
修理
Ben Voigtが指摘したように、CRT関数(ネイティブの静的初期化子を含む)を使用するには、CRTの適切な初期化が必要です(これは、、、またはで発生しmainCRTStartup
ますWinMainCRTStartup
)_DllMainCRTStartup
。main
C++またはWinMain
:を含む混合C ++/CLIファイルを追加しました。
これを行った後、プログラムはもう少し進んでいますが、まだ問題があります(これは他の場所で対処されます):
- プログラムがC#のみの場合は、C ++ / CLIメソッドを呼び出したり、C ++ / CLIプロパティを取得したり、マネージC ++/CLIオブジェクトを作成したりするだけで問題なく動作します。
- C#によってC ++ / CLIコードに追加されたイベントは、発生することはありません(発生するはずですが)
- もう1つの奇妙なエラーは、例外が発生することです。これは、XからXにキャストできないというInvalidCastExceptionです(XはXと同じです...)
ただし、ヒープの破損は(CRTを初期化することで)修正されるため、質問は行われます。
c++ - atexit()に登録されている関数が呼び出されない
atexitに登録されている関数は、通常のプログラム終了時に常に呼び出されることが保証されていますか?(FreeBSDで、プログラムが正常に終了した場合でも、atexitに登録した関数が呼び出されないというシナリオに遭遇しました)。