共有ライブラリ(またはDLL)がdlopenおよびdlcloseメカニズムを介して使用されており、作成された共有ライブラリに、メモリがヒープから取得されるグローバル変数がいくつかある場合、dlcloseが呼び出されると、それらの変数とメモリはどうなりますか?
同じプロセスでdlopenが再度呼び出された場合、どのように動作しますか?
共有ライブラリ(またはDLL)がdlopenおよびdlcloseメカニズムを介して使用されており、作成された共有ライブラリに、メモリがヒープから取得されるグローバル変数がいくつかある場合、dlcloseが呼び出されると、それらの変数とメモリはどうなりますか?
同じプロセスでdlopenが再度呼び出された場合、どのように動作しますか?
参照カウントをゼロに減らし、ライブラリが実際にアンロードされた場合dlclose
、ライブラリを後でリロードすると、ライブラリ内の静的ストレージ期間を持つすべての変数が元の値にリセットされます。
ただし、ライブラリが複数回開かれた場合、への最後の呼び出しを除くすべてがdlclose
参照カウントをデクリメントします。ライブラリがプログラムのローカルモジュールでない限り、知らないうちに他のライブラリの依存関係としてロードされた可能性があるため、ライブラリが複数回開かれたかどうかが明確でない場合があります。したがって、依存することはおそらく良い考えではありません。この「リセット」動作について。
雇用されたロシア人は追加しました:
ライブラリが
dlopen()
edとdlclose()
dを1回だけ実行し、他の依存関係ではない場合でも、ライブラリからシンボルを参照する(を介してdlsym()
)と、参照カウントが増加します(ライブラリをアンロードできなくなります)。少なくともLinuxでは。
この情報が正確かどうかはわかりません。今後は、他の人の回答を編集するのではなく、コメントまたは新しい回答として新しい情報を投稿してください。他の人の回答を編集するだけの場合は、他の人が望まないかもしれないあなたの回答の正しさについて責任を負わせることになります。