Выделение динамического массива в делегат C # (обратный вызов)

1

У меня есть собственный код 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)?

Теги:
pinvoke

1 ответ

3
Лучший ответ

Использование IntPtr является правильным. Память выделяется и освобождается от неуправляемой стороны. Поэтому вы не должны делать ничего, что связано с распределением и освобождением на управляемой стороне.

Просто прочитайте или напишите в массив, используя Marshal.Copy. Или, если вы предпочитаете использовать unsafe блок и интерпретировать IntPtr как double*.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню