与えられた: 実行可能ファイルは dll を使用します。それらには異なる c/c++ ランタイムがあります。それらの間のインターフェースにはどの制限が存在しますか? さらに、同じコンパイラ、同じ Boost バージョン (ただし、プリコンパイル済み Boost ライブラリは異なる) を使用します。
ランタイムごとにヒープが異なる可能性があることを理解しています。したがって、delete は同じヒープからの new に対応している必要があります。
最も重要なのは、インターフェイス STL オブジェクトを介して渡すことができないことです。これは、exe をビルドするときに STL オブジェクトが 1 つのランタイムにリンクされ、dll をビルドするときに同じオブジェクト (参照によって渡すか、インターフェイスを介してコピーする場合) が別のランタイムにリンクされるためです。また、別のランタイムは、そのオブジェクトの異なる実装を持つことができます。
ケースを考えてみましょう:
以下は安全だと思います。DLL は、パラメーターを持つ関数をエクスポートします: プライベート STL クラスをメンバーとして含む、エクスポートされたユーザー定義クラスへの参照。DLL は、このオブジェクトにメモリを割り当てます。Exe は、このオブジェクトを削除したいときに、このオブジェクトの Release メソッドを呼び出します。
以下は安全ではないと思います。ユーザー定義クラスは exe でインスタンス化され、exe/dll インターフェイス経由で渡されます。このクラスにはプライベート STL クラスがメンバとして含まれています。exe と dll は、このユーザー クラスのヘッダー/実装ファイルを共有します。このクラスが別のプロジェクトでビルドされる場合、異なる STL 実装が使用されます。たとえば、(異なるランタイムからの) string::size() の異なる実装が、メモリ内の同じオブジェクトに適用されます。
以下は安全だと思います。ユーザー定義クラスは exe でインスタンス化され、exe/dll インターフェイス経由で渡されます。このクラスは標準ライブラリに依存せず、プリミティブな C++ 型のみを使用します。exe と dll は、このユーザー クラスのヘッダー/実装ファイルを共有します。また、new と delete が同じヒープに対応するように制御する必要があります。たとえば、new / delete をオーバーロードして、::GetProcessHeap を使用することができます。
以下は安全ではないと思います: 標準ライブラリ クラスに依存する可能性があるため、exe/dll インターフェイス経由でブースト オブジェクトを渡します。また、delete は new のヒープに対応していない場合があります。
次のことは安全ではないと思います: ブースト オブジェクトを exe/dll インターフェイス経由で渡し、それらが標準ライブラリ クラスに依存せず、ヘッダーのみとして実装されていない場合でも、オブジェクトは 1 つのブースト ライブラリで作成できます (1 つのランタイムに対して)。 )および別のboost lib(別のランタイム用)で使用されます。また、delete は new のヒープに対応していない場合があります。
また、スマート ポインターのフレーバーを使用して、オブジェクト (項目 3 で説明) への参照を exe から dll および dll から exe に渡したいと考えています。このスマート ポインターは、デフォルト プロセス ヒープから参照カウンターを割り当てるために、new/delete もオーバーロードする必要があると思います。ポイントされたオブジェクトを削除しようとすると、このオブジェクトによってオーバーロードされた delete が呼び出されます (item3 のように)
項目 1 のオブジェクトの場合、ポイントされたオブジェクトのリリース メソッドを呼び出すカスタム スマート ポインターを使用したい (boost::shared_ptr とカスタム リリースを使用)
言及されていない問題はどれですか? 訂正してください。