1

グローバル変数を持つ共有ライブラリ ファイル (libtemp.so など) があるとします。このライブラリを動的にロードする場合は、ヒープ メモリを割り当ててからライブラリを閉じます。ライブラリを再度ロードすると、古いヒープ メモリがリークされますか? (ライブラリが再度ロードされるとグローバル変数がリセットされるので、それは本当だと思います)

ヒープメモリをグローバル変数に割り当てるのは悪い習慣ですか? これをしなければならないケースはありますか?

4

2 に答える 2

2

Linux では、ライブラリ グローバル変数は共有オブジェクトの一部のデータ セグメントにあり、そのセグメントは-ing時にmunmap-edされ、次に再び -ed されるため、グローバルは再初期化されます。dlcloselibtemp.sommapdlopen

(私は、あなたが 1 つのみを行っていると想定してdlopenlibtemp.soますdlopen

ところで、コンストラクタ関数で初期化(およびデストラクタでファイナライズ)を行うことができます.GCCの関数属性を参照してください。コンストラクタはdlopen一度に実行され、デストラクタは一度に実行されdlcloseます。詳細については、Linux dlopen(3)の man ページも参照してください。(POSIX dlopenにはこれらのトリックがないことに注意してください)

于 2012-08-01T05:32:28.707 に答える
1

ライブラリのアンロードと再ロードによってグローバル変数がリセットされるかどうかは、実装によって異なります。いずれにせよ、特に共有ライブラリでは、グローバル変数を使用することはお勧めできません。あなたが話している種類の最も一般的な使用例は、初期化時に計算されるグローバル テーブルを持つことです。static const代わりに、バイナリ ファイルに格納されているテーブルに置き換える必要があります。

于 2012-08-01T05:23:28.083 に答える