我应该为C#dllimport本机方法调用中的参数释放内存吗
本文关键字:参数 释放 内存 调用 C#dllimport 本机 方法 我应该 | 更新日期: 2023-09-27 18:29:36
我在C#中使用了带有DllImport功能的本机方法调用。我想知道是否应该在本机端手动释放方法参数的内存。
目前,我将double[]数组发送到本机方法,本机方法得到的paremers为double*类型。我应该在本机方法中释放double*吗?
不,应该让.NET自己处理内存管理。本机代码整理器遵循COM互操作的基本规则,而这些规则恰好在P/Invoke的大部分时间都有效,因为Win32也遵循这些规则。(也有例外,但它们会在Windows API文档中调用)。
既然您编写了p/Invoke调用的两端,那么您应该遵循相同的规则来简化您的生活。就内存分配而言,大多数时候调用者负责释放任何越过P/Invoke边界的内存,因为被调用者不知道这样做是否安全
- 如果为参数分配内存并将其传入
- 如果存在被调用者分配并返回的
out
参数或返回值
在这两种情况下,只有调用者知道何时不再需要内存,并且可以安全释放内存。在P/Invoke调用的情况下,运行时编组器知道这一点,它会在进行调用之前分配内存将double[]
编组到double *
,然后在调用返回时释放该内存。根据ref
、out
、[In]
或[Out]
属性的组合,它可能会也可能不会尝试将数据复制回double[]
,但它总是会释放内存。