使用互操作封送拆收器进行内存管理

Interop 封送拆收器始终尝试释放非托管代码所分配的内存。 此行为符合 COM 内存管理规则,但与控制本机 C++ 的规则不一致。

如果在使用平台调用(自动为指针释放内存)时预期采用本机 C++ 行为(不释放内存),则可能造成混乱。 例如,从 C++ DLL 调用以下非托管方法不自动释放任何内存。

非托管签名

BSTR MethodOne (BSTR b) {
     return b;
}

但是,如果将该方法定义为平台调用原型,用 String 类型替换每个 BSTR 类型,并调用 MethodOne,则公共语言运行时将尝试释放 b 两次。 可以通过使用 IntPtr 类型(而不是 String 类型)更改封送处理行为。

运行时始终使用 CoTaskMemFree 方法来释放内存。 如果使用的内存不是用 CoTaskMemAlloc 方法分配的,则必须使用 IntPtr 并使用适当的方法手动释放内存。 同样,可以在永远不应释放内存的情况下避免自动内存释放,例如,在从 Kernel32.dll(返回指向内核内存的指针)使用 GetCommandLine 函数时。 有关手动释放内存的详细信息,请参见 Buffers 示例

请参见

概念

方向特性

可直接复制到本机结构中的类型和非直接复制到本机结构中的类型

复制和锁定

其他资源

默认封送处理行为