2011-03-09 16 views
6

ファイルに結果を書き込むために使用した大規模なCコードライブラリがあります。私はそのようなのようなC++プログラム(一定のファイルI/Oを回避するため)にフロート*配列経由でのデータを返すために、それを変換:管理対象のC#で管理されていない無料のCコードメモリ

float* mgrib(...) 

これはCに罰金働い++ところ、私はメモリ「自由」でした。多くのフィールドは、関数から引き出されなければならないので、これは、ループ内にある

IntPtr pointer = mgrib(...); 
float[] result = new float[ size ]; 
Marshal.Copy(pointer, result, 0, size); 
Marshal.FreeCoTaskMem(pointer); 

:私は介して、適切にC#のにデータを得ることができました。それが256フィールド未満の場合、それは素晴らしい作品です。それ以上の場合は警告なしでクラッシュします。ファイルを適切に実行してから別のファイルを実行すると(合計が256を超える)、クラッシュします。私はCSの専門家にはほど遠いですが、256は偶然のようなものです。

洞察力に感謝します。ありがとう。

答えて

6

まず、C++ライブラリはCoTaskMemAllocを使用して戻り値バッファを割り当てますので、Marshall.FreeCoTaskMemを使用して解放することができますか? various memory (de)allocation functionsがあり、自由に組み合わせることはできません。

これは、ライブラリが「片面で」メモリを割り当てたり割り当てを解除することが非常に頻繁に行われる理由です。

void mgrib(..., float *buff, int buffsize); 
+0

ライブラリーは実際にはCコードです。これはmallocで割り当てられました(私はCoTaskMemAllocをcで割り当てることはできますか?)。 FreeCoTaskMemはmallocと互換性がありますが、私はこれらのようなトピックについて私の頭の中にいます。応答していただきありがとうございます。 – Anthony

関連する問題