2010-01-29 3 views
7

Как освободить ptrSentFromPinvokedDLL?Как освободить IntPtr в C#?

IntPtr ptrSentFromPinvokedDLL= IntPtr.Zero; 

int resultFromVendor = CallVendorDll(ref ptrSentFromPinvokedDLL); 

resultFromVendor = DoMoreWorkFromVendorDLL(
    ptrSentFromPinvokedDLL, "workonthis"); 

// Free ptrSentFromPinvokedDLLhere 
+4

Ну, как поставщик * выделил * указатель? Используйте соответствующий дезактиватор. –

+0

Предполагая, что вам даже нужно освободить его. – Michael

ответ

9

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

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

1

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

Смежные вопросы