読者です 読者をやめる 読者になる 読者になる

プロセス間でのC++オブジェクト共有はお勧めできない by Microsoft

DLLに共有のオブジェクト持たせようとおもってたんだけど
・・・うーむ、別の解法がいるってことか。

・仮想関数を持つクラスには、常に関数ポインタが含まれます。仮想関数を持つクラスは、共有データ セグメントにもメモリ マップト ファイルにも格納しないでください。これは特に MFC クラスや MFC を継承するクラスにとって重要です。

・静的データ メンバは、グローバル変数と同等に実装されます。つまり、各プロセスでは、クラスの静的データ メンバのコピーを独自に所有することになります。静的データ メンバを持つクラスは共有しないでください。

・共有データ セグメントの初期化要件により、C++ クラスに特定の問題が発生します。共有データ セグメントに CTest Counter(0); のような記述があると、DLL の読み込み時に各プロセスで Counter オブジェクトが初期化され、そのたびにオブジェクトのデータがゼロに設定される可能性があります。これは DLL の作成時にリンカによって初期化される組み込みのデータ型とは大きく異なります。


Microsoft ではプロセス間での C++ オブジェクトの共有をお勧めできません。通常、C++ を使ってプロセス間でデータを共有する場合は、メモリ マップト ファイルを内部的に使ってデータを共有するクラスを作成しますが、クラス インスタンス自体は共有しないでください。

ネタ元