使用 Interop 封送處理器的記憶體管理
Interop 封送處理器會不斷嘗試釋放由 Unmanaged 程式碼配置的記憶體。 這個行為使用 COM 記憶體管理規則編譯,但和管理原生 C++ 的規則不同。
當使用平台叫用 (自動釋放指標的記憶體) 時,若您預期原生 C++ 行為 (未釋放記憶體) 將會發生混淆。 例如,從 C++ DLL 呼叫下列 Unmanaged 方法並不會自動釋放任何記憶體。
Unmanaged 簽章
BSTR MethodOne (BSTR b) {
return b;
}
然而,如果您將方法定義成平台叫用原型 (Prototype),將每個 BSTR 型別以 String 型別取代,並呼叫 MethodOne,Common Language Runtime 會嘗試釋放 b 兩次。 您可以使用 IntPtr 型別 (而非 String 型別) 變更封送處理行為。
Runtime 永遠使用 CoTaskMemFree 方法來釋放記憶體。 如果您正在使用的記憶體不是使用 CoTaskMemAlloc 方法配置,您必須使用 IntPtr,並用適當方法手動釋放記憶體。 同樣地,您可在決不能釋放記憶體的情況下避免自動釋放記憶體,例如,從 Kernel32.dll 使用 GetCommandLine 函式,它會傳回指標到核心記憶體。 如需手動釋放記憶體的詳細資訊,請參閱緩衝區範例。