.NET - Вопрос по работе с памятью

Ответить
Аватара пользователя
navab

.NET - Вопрос по работе с памятью

Сообщение navab »

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



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

Re: .NET - Вопрос по работе с памятью

Сообщение Busla »

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

Вернуться в «Программирование и базы данных»