У меня есть собственный код C/C++, который вызывает делегат С# в качестве обратного вызова. Какая лучшая практика для передачи аргумента динамического массива? Фактически, указатель C является членом данных struct
и я передаю структуру обратному вызову.
Можно ли делать что-то подобное с помощью IntPtr
?
struct Data {
... (other data members)
double* array;
int size;
};
Массив - это указатель на массив, выделенный в моем коде C++ (просто вызов new
или malloc
). На стороне С# делегат ожидал бы
struct Data {
... (other data members)
IntPtr array;
int size;
}
Мое беспокойство заключается в том, должен ли IntPtr
выделяться память с использованием Marshal.AllocHGlobal
или это также безопасно, если память, выделенная в моем C++ коде (new
или malloc
)?
Использование IntPtr
является правильным. Память выделяется и освобождается от неуправляемой стороны. Поэтому вы не должны делать ничего, что связано с распределением и освобождением на управляемой стороне.
Просто прочитайте или напишите в массив, используя Marshal.Copy
. Или, если вы предпочитаете использовать unsafe
блок и интерпретировать IntPtr
как double*
.