グローバル変数を持つ共有ライブラリ ファイル (libtemp.so など) があるとします。このライブラリを動的にロードする場合は、ヒープ メモリを割り当ててからライブラリを閉じます。ライブラリを再度ロードすると、古いヒープ メモリがリークされますか? (ライブラリが再度ロードされるとグローバル変数がリセットされるので、それは本当だと思います)
ヒープメモリをグローバル変数に割り当てるのは悪い習慣ですか? これをしなければならないケースはありますか?
グローバル変数を持つ共有ライブラリ ファイル (libtemp.so など) があるとします。このライブラリを動的にロードする場合は、ヒープ メモリを割り当ててからライブラリを閉じます。ライブラリを再度ロードすると、古いヒープ メモリがリークされますか? (ライブラリが再度ロードされるとグローバル変数がリセットされるので、それは本当だと思います)
ヒープメモリをグローバル変数に割り当てるのは悪い習慣ですか? これをしなければならないケースはありますか?
Linux では、ライブラリ グローバル変数は共有オブジェクトの一部のデータ セグメントにあり、そのセグメントは-ing時にmunmap
-edされ、次に再び -ed されるため、グローバルは再初期化されます。dlclose
libtemp.so
mmap
dlopen
(私は、あなたが 1 つのみを行っていると想定してdlopen
いlibtemp.so
ますdlopen
。
ところで、コンストラクタ関数で初期化(およびデストラクタでファイナライズ)を行うことができます.GCCの関数属性を参照してください。コンストラクタはdlopen
一度に実行され、デストラクタは一度に実行されdlclose
ます。詳細については、Linux dlopen(3)の man ページも参照してください。(POSIX dlopenにはこれらのトリックがないことに注意してください)
ライブラリのアンロードと再ロードによってグローバル変数がリセットされるかどうかは、実装によって異なります。いずれにせよ、特に共有ライブラリでは、グローバル変数を使用することはお勧めできません。あなたが話している種類の最も一般的な使用例は、初期化時に計算されるグローバル テーブルを持つことです。static const
代わりに、バイナリ ファイルに格納されているテーブルに置き換える必要があります。