2006/05/20(土)グローバル変数とプラグインの罠

ここ最近,グローバル変数のデストラクタが2回呼ばれて困っていたんだけど,その原因が分かりました.

メインプログラムで定義されているグローバル変数と,プラグインで定義されているグローバル変数が同じ名前の場合,同じ実体を指してしまうようです.そのため,プラグインが終了するとき,メインプログラムが終了するときの2回同じ実体に対してデストラクタが呼ばれてしまう模様.ただし,これは,-rdynamicで変数を動的に割り当てている場合に発生する様です.

extern宣言しなければ,グローバル変数のスコープはファイル有効範囲であり,それより上のスコープの変数は隠蔽されると思っていたので...っていうか,普通そうだと思うんだけどなぁ.

このへんは,C,C++の仕様というより,Linuxにおけるダイナミックリンクの仕様なのかな.