2016-08-06 38 views
2

出力パラメータとして使用するためにC#からC++/CLIへの参照渡しの配列を渡しています。次のように私のコードは次のとおりです。C++/CLI、C#混在コードでのガベージコレクション

C#

ushort[] a = new ushort[1]; 
cppclr.method(ref a); 

C++/CLI

void method(array<ushort>^% a) 
{ 
    a = gcnew array<ushort>(5); 
    a[0] = 1; 
    a[1] = 2; 
    a[2] = 3; 
} 

コードは罰金コンパイルし、エラーを生成しません。しかし、私はC#で作成した配列がガベージコレクションによって処理されたかどうか混乱していますか?私の混乱は、私がC++/CLIの中に新しいメモリを割り当てているので、以前の参照が失われ、ガベージコレクションによって処理されるはずです。プログラムはメモリリークを表示しません。私はこの状況を他の方法で処理する必要がありますか?

+0

を私はあなたが.NET( 'gcnew')とないアンマネージコードを使用してメモリを割り当てている、GCは作業を行うと思います。私は100%確実ではない。 – null

+0

@null C++/CLIの中で 'gcnew'を使ってメモリを割り当てていて、その参照が保持されています。私はC#newによって作成されたメモリがメモリリークを引き起こすかどうか混乱していますか? – ubaabd

+0

は、.NETで作成されているので、GCがそれを処理するので、私は正しかったようです。これは、CLIとアンマネージタイプでは別の話です。 – null

答えて

3

すべてが処理されています。 C#またはC++/CLIやその他の.NET言語を実行しているかどうかにかかわらず、同じランタイムのが同じです。したがって、両方に対して同じGCが得られます。

gcnewを使用したため、ランタイムのマネージメモリアロケータを使用しました。 newをC++/CLIでアンマネージ配列と使用した場合は、後でdelete[]オペレータで解放する必要があります。

0

C#でのガベージコレクションは管理リソースで自動的に行われるため、気にする必要はありません。私はC++で大きな経験はありませんが、あなたが使用しているものからはManaged C++が使用されています。

.NET Frameworkのガベージコレクタは、アプリケーションの割り当てと メモリの解放を管理します。新しい オブジェクトを作成するたびに、共通言語ランタイムはオブジェクト のメモリを管理されたヒープから割り当てます。 管理されたヒープでアドレス空間が利用できる限り、ランタイムは引き続き新しいオブジェクトのための領域を割り当てます。 しかし、メモリは無限ではありません。最終的にガベージコレクタはメモリを解放するために コレクションを実行する必要があります。ガベージ コレクタの最適化エンジンは、行われた割り当てに基づいて コレクションを実行するのに最適な時間を決定します。ガベージ コレクタがコレクタを実行すると、管理された ヒープ内のオブジェクトがアプリケーションによって使用されなくなったことがチェックされ、 の操作を実行してメモリを再利用します。

MSDN Source Garbage Collection

あなただけのアンマネージリソースのための世話をする必要があります。(C#、彼らはIDisposableインターを継承し、あなたは@Lucasが述べたようにC++ []削除を呼び出すためのDispose()メソッドを呼び出す必要があるため)。

あなたもこの質問を確認することができます。 Garbage Collection Across C# and C++/CLI Objects

+0

OPは参照型への参照を要求しているので、 'ref'が必要です:)また、' ref'/'' 'の必要を避けるために戻り値の型として' void'の代わりに '配列^% 'パラメータ –

+0

@LucasTrzesniewski私はC++で経験がないと言ったような説明に感謝します。私はこの部分を削除します。 – mybirthname

関連する問題