Держась за массив, маршалированный в C # из C ++ - PullRequest
0 голосов
/ 24 декабря 2010

Я передаю массив целых чисел из C ++ в C #, используя такой параметр в моем методе C #:

[MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] 
UInt32[] myStuff,

Когда эти данные поступают в CLR, я думаю, что "LPArray" указывает, что я работаю с указателем из мира C ++ напрямую? Так что, если я хочу сохранить этот массив после завершения вызова метода, должен ли я сделать его копию?

Ответы [ 2 ]

1 голос
/ 24 декабря 2010

Вы должны быть осторожны, чтобы это распределялось с использованием одинаковых механизмов выделения памяти как в управляемом, так и в неуправляемом мире. И даже если это так, просто безопаснее сделать копию и работать с этим.

Примечание. В вашем примере указатель не передается по ссылке, поэтому вызываемый абонент может только добавить ваш предыдущий массив, но не дать вам новый массив. Это действительно то, что вы намеревались?

0 голосов
/ 14 июня 2012

При вызове из неуправляемого кода в управляемый код (от C ++ до C #) массив копируется в полностью управляемый массив.Этот массив будет освобожден, когда сборщик мусора заметит, что на него больше никто не ссылается, а не при выходе из функции.

Но другое направление более опасно: если вы двигаетесь в другом направлении (от C # до C ++), он либо: закрепит массив C #, чтобы он не перемещался, либо создаст временную копию массива в неуправляемую память (которая освобождается при возврате функции).В любом случае, было бы небезопасно удерживать массив на стороне C ++ после завершения вызова функции, вы бы хотели скопировать содержимое куда-то еще.

...