2016-09-01 6 views
3

この質問ではないことがよく知られているSOメモリ移転

で似た名前を持つものに重複している MSVCでDLLが静的にリンクされている場合(/ MTフラグ)、メモリを割り当てたDLLは割り当てを解除しなければならない(MUST)。それ以外の場合は メモリの割り当て解除によって実行時エラーが発生します。ここで

が問題である:

  • 私はDLL内std::vectorが割り当てられている、Aを言います。
  • Aは、このベクトルをDLL、たとえばBに渡します。
  • DLL Bは、ベクターにデータを挿入します。
  • DLL Aがベクトルを破棄しようとすると、エラーが発生します。通常、アイテム挿入時に起こる - -

私はBにベクトルを渡す前にstd::vector::reserveを使用する場合、データを保持し、メモリの再割り当てを防ぐのに十分な大きさのベクトルを持っていることを考え出した、私は得ることはありませんベクトルを破棄しようとしたときのAのエラー。メモリの再割り当ての場合、Bは、自身のヒープ内のベクトルに割り当てます。私の推論は間違っていますか?どうすればこれを防ぐことができますか?

+2

C++ランタイムの静的リンクを使用しないようにする – Serge

+1

別のオプション - Windowsヒープを使用してこのベクターのアロケータをオーバーライドします。 – Serge

+0

@Serge静的リンケージを使用してスタンドアロン実行ファイルを作成する必要があります。あなたはそのようなカスタムアロケータの例を知っていますか?以前はカスタムアロケータを作成しようとしましたが、それは簡単ではありませんでした。ありがとうございます –

答えて

3

最も簡単な方法は、vectorのメソッドがdllから公開されていないようにすることです。const vectorを他のdllファイルで表示できますが、変更することはできません。次に、呼び出し元の代わりにベクトルにエントリを追加するdll Bの新しい関数を作成します。

あなたのvectorは、すべての変更のためにdll Bの中に隠されたままです。

+2

これらの長さに行くなら、あなたが言及するDLL Bの関数を使用する "シャドーベクトルクラス"を持つ方が理にかなっていませんか?私。ベクトルクラスのユーザーには、それが法線ベクトルであるかのように見えます。 – 0xC0000022L

+0

@ 0xC0000022Lあなたのアイデアは素晴らしいです。ありがとうございました。 –

+0

あなたのアイデアを組み合わせて実装します。あなたがた両方に感謝します。私が何らかの不安に直面した場合は、同じ問題に直面する可能性のある人たちに、より良い洞察を与えるために質問を編集します。 –

関連する問題