7

DLL 境界を越えて STL コンテナーを公開することはお勧めできません。また、一般的には不可能です (理由についてはこの回答を参照してください。また、dll 境界を越えて std::list を公開することについては、この回答を参照してください)。異なる (VC08/VC10+) コンパイラでコンパイルされた DLL と EXE の間でデータを渡すことができる必要があります。この Qは、すべてが同じであることのみを扱います。

それらを公開する最良の方法は何ですか?ベクトルは、メモリが連続していることが保証されているという点でリストとは少し異なります。したがって、double の const ベクトルのみが必要な場合は、DLL 内の関数へのブロックへの開始ポインタと終了ポインタを提供するだけでよいでしょうか? dll は、ベクトルの配列などの構造を返す必要もあります。

開始ポインターと終了ポインターを含む構造体について疑問に思いました。

template <typename T>
struct vecWrapper<T> {
    T*  begin;
    T*  end;
}

// in the dll
int func(vecWrapper<double> numbers);

それは賢明でしょうか?おそらく、関数から返されるものはすべて、それが指すものを破壊するデストラクタ (dll 側) が必要になります。

4

1 に答える 1

3

あなたはそれをかなり釘付けにしました。標準では、ベクター要素がメモリ内で連続している必要があり、ベクターのアロケーターでゲームをプレイしていない限り、ベクター要素はスタックに割り当てられないため、ベクターのデータを開始ポインターと終了ポインター (または必要に応じて、開始ポインターとサイズ)。あなたが持っているものはうまくいくはずです。

ただし、それがどの程度使用されているかはわかりません。 std::vector自動メモリ管理以外には何も提供されませんが、それは望ましくありません。そうしないと、DLL で作成したベクトルは、破棄されると、元の double の配列の割り当てを解除します。配列をコピーすることでそれを回避できますが、それもしたくないと言っていました。STL アルゴリズムはポインターで正常に機能するため、DLL で変換する必要はないかもしれません。

于 2012-06-25T17:11:24.610 に答える