Я почти на 100% уверен, что CLR не освободит автоматически память, выделенную для теста (если бы это был PInvoke, я был бы уверен на 100%) Причина в том, как CLR узнает, что вы использовали для выделения памяти в первую очередь? А именно это не так.
Более безопасный способ написания этой функции заключается в следующем
void MemAlloc(ref IntPtr arrayPtr, int membercount)
Как только вы перезвоните, вы можете сделать следующее.
var count = GetTheCount();
var arrayPtr = IntPtr.Zero;
obj.MemAlloc(ref arrayPtr, count);
byte[] test = MarshalThePtrToByteArray(arrayPtr, count);
Marshal.FreeCoTaskMem(arrayPtr);
Вот быстрая и грязная реализация MarashalThePtrToByteArray
byte[] MarashalThePtrToByteArray(IntPtr ptr, int count) {
byte[] arr = new byte[count];
for ( int i = 0; i < count; i++ ) {
arr[i] = (byte)Marshal.PtrToStructure(ptr, typeof(byte));
ptr = new IntPtr(IntPtr.ToInt64() + Marshal.SizeOf(typeof(byte)));
}
return arr;
}