1

GetRecord構造にメモリを割り当てる方法が1つある通常のdllを作成しましたRecordInfo

struct RecordInfo{
  // Some Data member
}

BOOL GetRecord(RecordInfo *& pRecordInfo)
{
   // Allocate RecordInfo, fill data and return as out paramter.
}

今、私はMFCアプリケーションからこのdllにアクセスし、作業が終了した後です。削除を使用してクライアントでRecordInfoを解放します。

delete pRecordInfo;

リリースモードでは問題はありませんが、デバッグモードではアプリケーションはアサーションの失敗を示します。誰かがこの行動の背後にある理由を説明できますか?

4

3 に答える 3

2

メモリの割り当てと割り当て解除は、コンポーネント / dll の同じ側で行う必要があります。

より洗練された解決策は、std::unique_ptr<RecordInfo>代わりに a を設定することです。

于 2012-09-20T08:54:29.877 に答える
1

DLL にメモリを割り当て、クライアント コードで解放する場合は、DLL とクライアントの両方が同じバージョンのコンパイラ同じ CRT "フレーバー" でビルドされていることを確認する必要があります (たとえば、両方ともデバッグ ビルドである、またはどちらもリリース ビルドです)。

もちろん、これは非常に制約的です。

別の方法として、物事をより適切に分離するために、DLL 関数からエクスポートして、データ構造の割り当て割り当て解除の両方を行うことができます (特定のケースでは、DLL から関数を追加およびエクスポートし、この関数本体内からDeleteRecord呼び出すことができます)。delete

Old New Thing ブログのこの興味深いブログ投稿を読むことをお勧めします。特に最初の文に注意してください (強調は私のものです)。

メモリを割り当てるコードとメモリを解放するコードが同じ allocatorを使用する必要があることは、当然のことです。

于 2012-09-20T09:01:15.147 に答える
1

プロデューサーとコンシューマーは、共通のアロケーターについて合意する必要があります。Windows の世界では、この目的のために正確に記述されたCoTaskMemAlloc/が最も適切な選択です。CoTaskMemFree

于 2012-09-20T09:02:48.077 に答える