1

私はdlopenを使用して「lib1.so」などの動的ライブラリをロードし、A1などの1つの公開された関数を呼び出します。A1関数はmallocを使用して100kbの動的メモリを割り当てますが、それを解放しません。メイン関数で再びすべてdlcloseします。[dlopen、関数 A1 の呼び出し、dlclose]

この手順を 10 回繰り返します。Purify はこれを 1000KB のメモリ リークとして報告し、valgrind は間接的に 1000KB を失ったと報告します。

100 KB * 10 回 = 1000KB を提案していただけますか? 本当のメモリ リークですか? dlclose を呼び出したので、動的ライブラリに割り当てられたすべてのメモリは、dlclose を呼び出すと自動的に解放されますか?

OS: Linux プログラミング lan: C

4

3 に答える 3

5

dlcloseで割り当てられたメモリを解放しませんmalloc。ライブラリで宣言されている静的変数のみを解放します。ライブラリ内、場合によっては関数内で、割り当てられたメモリを明示的に解放する必要があり_finiます。

于 2011-10-31T14:39:12.807 に答える
3

dlcloseのマニュアルページには、呼び出されたときにメモリを解放することについては何も書かれていません。

dlclose()
   The  function  dlclose()  decrements the reference count on the dynamic
   library handle handle.  If the reference count drops  to  zero  and  no
   other  loaded  libraries use symbols in it, then the dynamic library is
   unloaded.

   The function dlclose() returns 0 on success, and nonzero on error.

魔法はありません。

Linuxを使用している場合は、このメソッドを試してmalloc()をラップし、割り当てられたメモリを追跡できます。

于 2011-10-31T14:36:50.997 に答える
2

いいえ、メモリは、ダイナミックライブラリが閉じられたときではなく、プロセスが終了したときに再利用されます。

于 2011-10-31T14:37:27.893 に答える