問題タブ [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.
c - グローバル変数を使用せずに atexit などでメモリを解放する方法はありますか?
C でプロジェクトを開発しています。割り当てられたメモリを解放し、終了する前に開いているすべてのファイルを閉じる必要があります。
多くの可能な終了シナリオがあるためclean
、これらすべてを実行して呼び出す関数を実装することにしました。atexit
問題は、atexit
パラメーターを使用して関数を設定できないためclean
、プロセスの最後に解放する必要があるポインターに送信できないことです。
では、解放する必要がある可能性のあるすべてのポインターと、プログラム内で開いたままになる可能性のあるすべてのファイルをグローバル変数として宣言する必要がありますか? (私はすでにそれを行いましたが、見栄えがよくありません)またはatexit
パラメータを送信できる同様の機能が存在しますか? または、おそらく私が見逃している別の方法がありますか?
c - ネストされた関数に atexit を登録すると、gcc でセグメンテーション違反が返される
a
ネストされた関数内に表示されますが、セグメンテーション違反の原因は何ですか?
c++ - C++ ライブラリのクラッシュをキャッチする一貫した方法
私はさまざまなサイトを見回しましたが、この質問に対する答えは見つかりませんでした。タイトルが示すように、作業中のライブラリがクラッシュした場合にキャッチする方法を見つけようとしています。ライブラリにある多くのマネージャ スタイル クラスのインスタンスを保持する Root クラスがあり、デストラクタでインスタンスを解放します。当然のことながら、マネージャーはかなりの量のデータを担当しているため、データを適切に破棄しないと、かなり許容できない、さらには危険なレベルのメモリ リークが発生する可能性があります。
プログラムがクラッシュすると、OS がプログラムのスタック領域の割り当てを解除することは承知していますが、割り当てられたオブジェクトのデストラクタの呼び出しは含まれません。また、実行中に割り当てられたヒープを削除することも含まれていません。これは、ライブラリ内の大量のメモリを処理する方法であり、広範なメモリ リークの問題に戻ります。
私が他のサイトで見つけた多くの回答は、関数を に登録するように言っているだけatexit()
ですが、アプリケーションがクラッシュした場合、その関数は機能しません。そして、前述のように、クラッシュはデストラクタを呼び出さないため、破棄されたときにすべてを閉じるグローバル シングルトンを作成する方法はありません。私のもう 1 つの考えは、ライブラリのエンド ユーザーが適切な予防策を講じてクラッシュを回避することを期待することでした (例外スローの広範な使用を通じて)。それに対処するためにエンドユーザーに少し多くのことを求めています。
TL;DR の質問は次のとおりです。標準の C++ 関数または何らかのマネージャー クラスを使用して、ライブラリがクラッシュしたときにそれをキャッチして適切に処理する方法はありますか?
編集:また、これに対処するには、クロスプラットフォームの方法を本当に好みます。私のコード ベースは C++11 の機能を多用しているため、使用可能なコンパイラを GCC と Clang の最新バージョンにプログラムで制限しました。
それだけでなく、ファイル システムへのストリームを閉じて、終了ステータスに関するいくつかのメッセージを出力する Logger などのクラスもいくつかあります。ファイルへのメモリリークの可能性を報告するメモリトラッカーもありますが、デストラクタでのみです。
python - 終了時にコードを実行
私のコードでは、次のような関数があります。
set_var
データベースに含まれる変数を設定します。
これらすべての の目的はset_var
、複数のインスタンスが同時に実行されるのを防ぐことです。
atexit
ハンドラーは、プログラムが中断されている場合は正常に機能しますCtrl-Cが、システムなどによって強制終了された場合は機能しません。
私は知ってsignal
いますが、ハンドラーをキャンセルすることはできません。
それ、どうやったら出来るの?または、同じ機能を実現するために構造をどのように変更できますか?
c++ - C++ の .dtors と atexit() の違い
.dtors
内の関数と を使用して呼び出される関数の違いは何atexit()
ですか?
((destructor))
私が理解しているように、属性でマークされた関数は.dtors
セグメントに配置され、終了後に呼び出されます。同様に、 を使用して追加された関数atexit(fctName)
は配列に配置され、通常の実行終了後にも呼び出されます。
では、なぜ C++ はここで 2 つの異なるメカニズムを提供するのでしょうか? 1つだけでできる明確なことはありますか?を使用して関数を動的に追加することしかできatexit()
ませんか?
また、最初に呼び出される関数、.dtors
または ? を使用して追加された関数はatexit()
どれですか?
c++ - atexit() で非 void 関数を登録する方法は?
int
関数を使用してプログラムの最後に呼び出されるを返す関数を登録しようとしていatexit()
ます。(具体的には、endwin()
ncurses の関数です。)
しかし、関数atexit()
へのポインタが必要なので、問題が発生しました。void
私は次のことを試しました:
しかし、関数から関数へのstatic_cast
ingは許可されていないようです。int
void
私が達成しようとしていることはまったく可能ですか? はいの場合、どのように?
注:関数の戻り値は無視してもかまいません。
編集:ラムダ関数も作成しようとしましたが、これは私が望むことをしているようです:
ラッパー/転送機能と比較して、これは良い解決策ですか? (それ以外は、C++11 を必要とし、別の関数を転送することだけを目的とする新しい関数を定義することを避けます。)
c++ - 共有ライブラリで atexit を呼び出す方法は?
共有ライブラリでは、関数 func1() に atexit(terminate_global) があり、この共有ライブラリには「属性((コンストラクタ))」と「属性((デストラクタ))」
がありません。
したがって、プログラム フローは次のようになります。
1) アプリケーションは、dlopen を使用して共有ライブラリを読み込みます。
2) アプリケーションは、dlsym を使用して func1() を呼び出します。
3) func1() には atexit(terminate_global) があります。
4) func1() が戻ります。
5) アプリケーションは dlclose を呼び出して、ライブラリの割り当てを解除します。
上記の手順では、ライブラリがアンロードされたときに atexit() が呼び出されていません。では、共有ライブラリの割り当てを解除するときに atexit() を呼び出す必要がある場合、正しい方法は何でしょうか? atexit 登録関数を呼び出せるように、属性((コンストラクタ)) および属性((デストラクタ)) 関数属性を使用してルーチンをエクスポートする必要がありますか?