C++dll転送ポインタを呼び出してメモリを解放する問題について
一、dllに入る前に、C〹の中でメモリ空間を申請する。
cxiの中の指針はIntPtrです。
申請は以下の通りです
cxiの中で空間を申請しましたが、c++の中は普通これらの空間で操作します。メモリを再分配しませんので、引用を追加する必要がありません。
c++:
この時、cxiは外部でメモリ空間を申請する必要がなく、ポインタを初期化すればいいです。
c++:
cotaskmallo方式でメモリを申請する場合:
三、clrモードのC++dll
テストを経て、clr、C++内部をnewでメモリを割り当てると、C〓の中はFreeHGlobalで正常に釈放できます。
ここでC++dll転送のポインタを呼び出してメモリを解放する問題についての文章を紹介します。これに関連してcxi++dllを呼び出してメモリの内容を釈放します。以前の文章を検索してください。または下記の関連記事を引き続きご覧ください。これからもよろしくお願いします。
cxiの中の指針はIntPtrです。
申請は以下の通りです
IntPtr SrcImgData = Marshal.AllocHGlobal(length);
このような空間の大きさを知っておく必要があります。空間の大きさを決められないと、dll内部処理時にエラーが発生します。cxiの中で空間を申請しましたが、c++の中は普通これらの空間で操作します。メモリを再分配しませんので、引用を追加する必要がありません。
c++:
uchar* SrcImg
cxiがdll関数を導入する時、説明します。
IntPtr SrcImg
メモリの放出は自然にcxiで行われます。
Marshal.FreeHGlobal(SrcImgData);
二、dll内部はポインタにメモリを再割り当てします。この時、cxiは外部でメモリ空間を申請する必要がなく、ポインタを初期化すればいいです。
IntPtr SrcImg = IntPtr.Zero;
dll内部で空間を申請して、いくつかの変更をしましたので、C〓に戻すには引用が必要です。c++:
uchar* &SrcImg
cxiがdll関数を導入する時、説明します。
ref IntPtr SrcImg
C++内部アプリケーションのメモリ空間にはいくつかの方法があります。newまたはmalloの場合、これらの2つの割当方法であれば、dllはメモリを放出する関数インターフェースを提供しなければなりません。そうでなければ、C龛は正常にメモリを解放できなくなり、長時間の実行メモリは徐々に増加し、すなわちメモリ漏れになります。cotaskmallo方式でメモリを申請する場合:
SrcImg = (uchar*)CoTaskMemAlloc(length);
C菗中は正常に釈放されます。
Marshal.FreeHGlobal(SrcImg);
もちろん、C++にリリースインターフェースが提供されたら、このように釈放する必要はありません。三、clrモードのC++dll
テストを経て、clr、C++内部をnewでメモリを割り当てると、C〓の中はFreeHGlobalで正常に釈放できます。
ここでC++dll転送のポインタを呼び出してメモリを解放する問題についての文章を紹介します。これに関連してcxi++dllを呼び出してメモリの内容を釈放します。以前の文章を検索してください。または下記の関連記事を引き続きご覧ください。これからもよろしくお願いします。