2011-01-19 12 views
4

共有ライブラリ(またはDLL)がdlopenおよびdlcloseメカニズムによって使用されていて、作成された共有ライブラリにヒープからのメモリが含まれているグローバル変数がある場合、dlcloseが呼び出されると、 ?dlcloseを呼び出すと、共有ライブラリのグローバル変数はどうなりますか?

同じプロセスでdlopenが再び呼び出された場合、動作は何ですか?

+0

グローバル変数は通常ヒープに由来しません。あなたの質問は無効な仮定を使用しているようです。 –

+0

@Employedロシア語、私はヒープからメモリを割り当てるグローバル変数を持っています。それにはどんなことが起こるでしょうか?また、通常の静的グローバル変数が存在する場合、それはどうなりますか? – Jay

答えて

8

dlcloseが参照カウントを0に減らし、ライブラリが実際にアンロードされた場合、ライブラリの将来の再ロードでは、ライブラリ内の静的格納期間を持つすべての変数が元の値にリセットされます。

ただし、ライブラリが複数回開かれた場合は、dlcloseの最後の呼び出しを除くすべてが参照カウントを減らします。時には、ライブラリが複数回開かれたかどうかは明らかではないかもしれません。なぜなら、あなたのプログラムにローカルなモジュールでない限り、他のライブラリの依存としてロードされているかもしれないからです。だから、おそらく、この「リセット」動作について説明します。

をライブラリがdlopen() EDとdlclose()が正確に一度Dであり、そして何か他のものの依存関係ではない場合でも、(dlsym()を経由して)それからシンボルを参照する行為も増加します:ロシア語が追加就業

参照カウント(ライブラリをアンロード不可能にする)。少なくともLinuxでは。

この情報が正確かどうかはわかりません。将来は、新しい情報をコメントや新しい回答として投稿し、他の人の回答には編集しないでください。あなたが他の人の回答を編集するだけであれば、彼らは自分の答えの正しさについて責任を持つようになります。

+0

@R、答えをありがとう。静的ストレージを持つすべてのグローバル変数が自動的にリセットされることを意味しますか? mallocによってメモリが割り当てられたグローバルポインタはどうですか? – Jay

+0

メモリがリークするかどうかを確認する場合は、答えは「はい」です。ポインタが失われます。 **これをしないでください**ライブラリがグローバル状態を維持する必要がある場合は、ダイナミックアロケーションではなく静的ストレージ期間のオブジェクトを使用してください。データが単に実行時に生成される定数の表である場合は、代わりにコンパイル時に生成するスクリプトを作成し、静的なconst配列にします。あなたは(安い)ディスクスペースを犠牲にし、(貴重な)たくさんのメモリを節約します。 –

+1

また、醜い回避策があることにも注意してください:あなたのライブラリ 'dlopen'自体を持って、一度読み込まれた後にリファレンスカウントが決してゼロにならないように、返されたポインタを投げ捨ててください。しかし、私はこれを行うことをお勧めしません... –

関連する問題