PDA

Показать полную графическую версию : Вопрос по работе с памятью


navab
11-12-2012, 16:51
Нужно передать в качестве параметра указатель на массив. Я так понимаю, есть несколько способов это сделать.

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, а при использовании указателя какие-либо действия по очистке нужны? Указатель, как я понимаю, тоже в неуправляемой памяти создается.

Спасибо.

Busla
14-12-2012, 10:46
navab, массив - это объект, а объект и так передаётся по ссылке




© OSzone.net 2001-2012