Если вы хотите, чтобы память переживала область действия функции, и не хотите использовать глобальные переменные, то вы должны выделить ее не из стека (локальной переменной).
Вы можете использовать любой распределитель,вы можете использовать тот, который уже известен .NET, или если вы используете другой, специфичный для C ++ или вашей платформы, то вы также должны предоставить другую функцию P / Invokable для освобождения, что-то вроде этого:
C ++
int* read_array_adapter()
{
int nCount[5] = {0, 1, 2, 3, 4};
return AllocateAndCopy(...);
}
void free_array_adapter(int *) // or a generic pointer of course...
{
Free(...);
}
C #
static void Main(string[] args)
{
var ptr = read_array_adapter();
var result = new int[5];
Marshal.Copy(ptr, result, 0, 5);
free_array_adapter(ptr);
}
[DllImport(@"/sharedlibrary.so",CallingConvention = CallingConvention.Cdecl)]
public extern static IntPtr read_array_adapter();
[DllImport(@"/sharedlibrary.so",CallingConvention = CallingConvention.Cdecl)]
public extern static void free_array_adapter(IntPtr ptr);
Вы также можете использовать известный распределитель между .NET и C / C ++, но это зависит от платформы (Windows, Linux и т. Д.): https://www.mono -project.com / docs / advanced / pinvoke /
Вот пример реализации с malloc / free duo в C:
int* read_array_adapter()
{
int nCount[5] = { 0, 1, 2, 3, 4 };
int* p = (int*)malloc(5 * 4);
memcpy(p, nCount, 5 * 4);
return p;
}
void free_array_adapter(void * ptr)
{
free(ptr);
}