複数のDLLからスタティックライブラリ内のシングルトンのクラスを呼ぶと大変なことに。

先に結論

  • DLL毎に異なるインスタンスが生成されます!
  • なので、スタティックライブラリにせず、DLLにするべき
  • どうしてもスタティックライブラリにしたい時は、シングルトンのクラス取得用のDLLを作れば大丈夫

実験

たとえばこんなのがあるとします。



ここで、
SubDLL1,SubDLL12およびmainから以下のインスタンスのポインタを取得します。

  • SigleDLL
  • SigleLIB
  • GuardDLL経由で、SigleDLL


すると、それぞれのインスタンスのポインタは以下のようになります。

取得先 インスタンスのポインタ
SingleDLL 同一
SingleLIB 異なる
GuardDLL経由で、SigleDLL 同一


つまり、上でも言ったように、

  • スタティックライブラリ内のシングルトンのクラスはDLL毎にインスタンスが異なる
  • DLL内のシングルトンのクラスは全DLLで同一のインスタンス
  • 単一のDLL経由で、スタティックライブラリ内のシングルトンのクラスを取得しても、全DLLで同一のインスタンス

なんでなの?


以下は仮説です。
スタティックライブラリは静的リンク。

静的リンク(せいてきりんく)とは、アプリケーションプログラムをリンクした時に必要なライブラリをプログラムに含める方式。

via wikipadia("静的リンク")


なので、スタティックライブラリは、各dllに取り込まれて、それぞれ別のものとして動いている。
っていうのが理由だと思われます。


それであってるか確認中です。
わかったら、また更新します。


ややこしいね。
そんなですー。