Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Вопрос по работе с памятью (http://forum.oszone.net/showthread.php?t=248899)

navab 11-12-2012 16:51 2043190

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

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 2045096

navab, массив - это объект, а объект и так передаётся по ссылке


Время: 23:45.

Время: 23:45.
© OSzone.net 2001-