共用方式為


使用 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 函式,它會傳回指標到核心記憶體。 如需手動釋放記憶體的詳細資訊,請參閱緩衝區範例

請參閱

概念

方向屬性

Blittable 和非 Blittable 型別

複製和 Pin

其他資源

預設的封送處理行為