私は C++ ライブラリを持っています。そのヘッダーは次のようになります。
void NotMyFun(double * a, int * b);
この関数は から読み取りa
、 に書き込みますb
。ライブラリを呼び出すために、以下の関数が定義されている C++/CLI ラッパーを作成しました。
static void MyWrapperFun(double * a, int * b)
{
NotMyFun(a,b);
}
そして正常に動作します。C# コードから、たとえば と という 2 つのマネージ配列がdouble[] ma
ありdouble[] mb
、そこにma
は意味のあるデータが既に保持されておりmb
、ラッパーが呼び出されると意味のあるデータが入力されます。以下は、ラッパー関数を呼び出すための適切な方法ですか?
unsafe
{
fixed (double* pma = ma)
{
fixed (int* pmb = mb)
{
MyWrapperNS.MyWrapperClass.MyWrapperFun(pma,pmb);
}
}
}
安全でないポインターは速い方法ですか? C++/CLI ラッパーとの間で受け渡しを行う際にデータのコピーは必要ですか? または、ポインターは既に C# 配列の連続したメモリ空間を指していますか?
その上、ここで手動のメモリクリーニングが必要ですか? ポインターがマネージ C# 配列のメモリに関連付けられている場合、それらは後で適切にガベージ コレクションされると思いますが、確認したいだけです。