2010-12-10 16 views
3

2つのバイナリがあります。 1つはネイティブ/アンマネージC++ dllで、もう1つはc#exeで管理されています。今私がやっていることは、C++ dllに関数を書いてmallocを使ってその中にメモリを割り当てたことです。この関数をC#モジュールで使用するためにエクスポートしました。 Cではマネージコードによってロードされたアンマネージコードでメモリを解放する必要がありますか

++私がやった:私はC#で

char* FunctionHavingAllocatedMemory(int i){ 

char* p = (char*)malloc(100); 

..... 

//use p and do not free it. 

return p; 

} 

[DllImport("C++.dll")] 

private static extern string FunctionHavingAllocatedMemory(int i); 

は今、私の質問は次のとおりです。Cの空きメモリへのニーズが存在する++モジュールまたはC#のモジュールが自動的に解放されますそれは機能が戻るときそれ。私はなぜC#が管理されているので、メモリを自動的にクリーンアップするのだろうと思っています。

(ただし、C++でメモリを解放するのは良いことですが、C++でメモリを解放できないという制約があります。マネージアプリケーションとメモリ管理の処理方法についてもっと理解したいと思っていました)

答えて

2

ガベージコレクタは管理対象ヒープでのみ動作しますFunctionHavingAllocatedMemoryで割り当てられたメモリは無料でお使いください。

0

GCは、管理されていないコードの管理コードのメモリを管理します。管理されていないコードは、メモリの再利用方法を心配する必要があります。

私は、内部的にメモリを解放する関数をC++クラスで定義することができます。

2

また、C#でMarshal.AllocHGlobal()を使用してアンマネージメモリを割り当て、ネイティブdllにポインタを渡して、C#でMarshal.FreeHGlobal()に戻すこともできます。 Marshalクラスには、割り当てられたメモリにデータをコピーしたり、割り当てられたメモリからデータをフェッチするための関数もあります。

関連する問題