Как бесплатно IntPtr в C #? - PullRequest
       41

Как бесплатно IntPtr в C #?

8 голосов
/ 29 января 2010

Как бесплатно ptrSentFromPinvokedDLL?

IntPtr ptrSentFromPinvokedDLL= IntPtr.Zero;

int resultFromVendor = CallVendorDll(ref ptrSentFromPinvokedDLL);

resultFromVendor = DoMoreWorkFromVendorDLL(
    ptrSentFromPinvokedDLL, "workonthis");

// Free ptrSentFromPinvokedDLLhere

Ответы [ 2 ]

10 голосов
/ 29 января 2010

В идеале либо поставщик беспокоится об этом, либо должна быть функция поставщика для освобождения памяти. Если нет, вам нужно знать, как поставщик выделил память. Например, если поставщик выделил память, используя LocalAlloc в kernel32.dll, вы можете освободить память, используя Marshal.FreeHGlobal(IntPtr). Аналогично, если бы использовался распределитель памяти COM CoTaskMemAlloc, то для освобождения памяти использовался бы Marshal.FreeCoTaskMem(IntPtr). Поэтому проверьте документацию и действуйте соответствующим образом.

Для справки, вот хорошая статья MSDN о моделях выделения памяти.

1 голос
/ 29 января 2010

Нет способа узнать, как освободить его или даже если его нужно освободить, не видя код внутри CallVendorDll. (Или некоторая документация)

...