 |
|
Вопрос по работе с памятью
Нужно передать в качестве параметра указатель на массив. Я так понимаю, есть несколько способов это сделать.
1. С помощью указателя
Код:
char array =... //задаем массив
SizeIn = sizeof(char) * array.Length;
IntPtr Out= IntPtr.Zero;
int SizeOut;
unsafe
{
fixed (char* p = &array[0])
{
IntPtr In= new IntPtr(p);
int result = WrappedOrdercl.WrappedOrdercl.ExecQuery(SizeIn, In, out SizeOut, out Out);
}
}
//// полученный результат обрабатывается следующим образом
char* newp = (char*)Out.ToPointer();
for (int i = 0; i < SizeOut/sizeof(char); i++)
{
newarray[i] = *newp;
++newp;
}
2. С помощью Marshal
Код:
SizeIn = sizeof(char) * array.Length;
IntPtr In= Marshal.AllocHGlobal(SizeIn);
IntPtr Out= IntPtr.Zero;
int SizeOut;
Marshal.Copy(array, 0, In, array.Length);
int result = WrappedOrdercl.WrappedOrdercl.ExecQuery(SizeIn, In, out SizeOut, out Out);
//// полученный результат обрабатывается следующим образом
Marshal.Copy(Out, Answ, 0, SizeOut/ sizeof(char));
Marshal.FreeHGlobal(In);
Marshal.FreeHGlobal(Out);
Посоветуйте, какой подход когда лучше использовать и какие могут быть подводные камни. Например, во втором случае выделенная память в куче совобождается посредством FreeHGlobal, а при использовании указателя какие-либо действия по очистке нужны? Указатель, как я понимаю, тоже в неуправляемой памяти создается.
Спасибо.
|
navab, массив - это объект, а объект и так передаётся по ссылке
|
Время: 23:45.
© OSzone.net 2001-