問題タブ [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.

0 投票する
5 に答える
1037 参照

iphone - これは決定的な参照カウントの目的の C シングルトン実装ですか?

これは、シングルトンの文献を熟読した後、私が作成したものです。私は何かを忘れましたか?

0 投票する
2 に答える
5067 参照

c - atexit コマンドを取り消したり削除したりできますか?

終了スタックに置くatexit( fn );と、プログラムが終了したときに実行されます: return frommain()または via exit().

スタックから削除できますか?

なぜ私はこれをしたいのですか?

atexitsetjmpおよびを使用して、単純な try-catch メカニズムを試していましたlongjmpundo-atexit(fn);最後に登録された関数でしか機能しない場合でも、できれば完璧です。

編集:

モノセレスの提案に従って、独自のスタックを作成します...

現在、スタックは 1 つの例外キャッチャーでのみ機能します。

0 投票する
1 に答える
13589 参照

python - Python プロセスは atexit を呼び出さない

で使用しようとしていますatexitProcess、残念ながら機能していないようです。コード例を次に示します。

このコードの出力は次のとおりです。

W.run.log_terminate()とが呼び出されたときa.terminate()にが呼び出され、出力が次のようになることを期待しb.terminate()ます (強調を追加)!:

なぜこれが機能しないのですか? また、 aが終了Processしたときに (コンテキストから)メッセージをログに記録するより良い方法はありますか?Process

ご意見をお寄せいただきありがとうございます。

解決

編集: Alex Martelli によって提案された解決策に基づいて、次は期待どおりに機能します。

atexitドキュメントの次のコメントに注意してください。

注: このモジュールを介して登録された関数は、プログラムがシグナルによって強制終了されたとき、Python の致命的な内部エラーが検出されたとき、または os._exit() が呼び出されたときに呼び出されません。
0 投票する
1 に答える
1740 参照

python - atexit での他のモジュールの参照

プログラムの終了時に子プロセスを強制終了する機能があります。

ただし、この関数が呼び出されるとエラー メッセージが表示されます。

ossignalモジュールatexitが呼び出される前にアンロードされるようです。それらを再インポートすると問題は解決しますが、この動作は奇妙に思えます。これらのモジュールはハンドラーを登録する前にインポートされるのに、なぜ自分の終了ハンドラーが実行される前にアンロードされるのでしょうか?

0 投票する
2 に答える
1506 参照

python - 他のスクリプトから呼び出されたときに機能する python atexit モジュールの代替

atexit.register(function)Python スクリプトの終了時に呼び出される関数を登録するためにを使用することは、一般的な方法です。

問題は、これが醜い方法で失敗するケースを特定したことです。スクリプトが別の python スクリプトから実行された場合、execfile().

この場合、Python は終了時に関数を見つけることができないことがわかります。これは理にかなっています。

私の質問は、この問題が発生しない方法でこの機能を維持する方法です。

0 投票する
3 に答える
2750 参照

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 関数を実行しないようです。

0 投票する
1 に答える
5163 参照

c++ - dlclose() は、グローバル オブジェクトのデストラクタを呼び出しません。

plugin1.cpp:

ホスト.cpp

ビルドして実行:

TestStatic::~TestStatic が「dlclose()」ではなく「exit()」で呼び出されるのはなぜですか?

0 投票する
5 に答える
4566 参照

python - Python: クロージャーとクラス

atexitクラスで使用する関数を登録する必要があります (Foo例については以下を参照)。残念ながら、メソッド呼び出しを介してクリーンアップする直接的な方法はありません: 私が制御できない他のコード、呼び出しFoo.start()Foo.end()しかしエラーが発生した場合に呼び出されFoo.end()ないことがあるので、自分でクリーンアップする必要があります。

このコンテキストでのクロージャーに関するアドバイスを使用できます。

  • クロージャーは適切に機能しますか? たとえば、 でdo_cleanup、self の値は正しくバインドされていますか?

  • atexit() ルーチンの登録を解除するにはどうすればよいですか?

  • これを行うより良い方法はありますか?

編集:これはPython 2.6.5です

0 投票する
1 に答える
5420 参照

c# - 混合モードC++/ CLIのクラッシュ:atexitでのヒープの破損(静的デストラクタ登録)

私はプログラムのデプロイに取り組んでおり、コードベースはC ++ / CLIとC#の混合物です。/clrC ++ / 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_DllMainCRTStartupmainC++またはWinMain:を含む混合C ++/CLIファイルを追加しました。

これを行った後、プログラムはもう少し進んでいますが、まだ問題があります(これは他の場所で対処されます):

  • プログラムがC#のみの場合は、C ++ / CLIメソッドを呼び出したり、C ++ / CLIプロパティを取得したり、マネージC ++/CLIオブジェクトを作成したりするだけで問題なく動作します。
  • C#によってC ++ / CLIコードに追加されたイベントは、発生することはありません(発生するはずですが)
  • もう1つの奇妙なエラーは、例外が発生することです。これは、XからXにキャストできないというInvalidCastExceptionです(XはXと同じです...)

ただし、ヒープの破損は(CRTを初期化することで)修正されるため、質問は行われます。

0 投票する
2 に答える
3501 参照

c++ - atexit()に登録されている関数が呼び出されない

atexitに登録されている関数は、通常のプログラム終了時に常に呼び出されることが保証されていますか?(FreeBSDで、プログラムが正常に終了した場合でも、atexitに登録した関数が呼び出されないというシナリオに遭遇しました)。