2014-11-08 76 views

回答

3

不,你应该让.NET处理内存管理本身。本地代码编组器遵循COM互操作的基本规则,这也是P/Invoke大部分时间工作的原因,因为Win32也遵循规则。 (也有例外,但他们会在Windows API文档中调出)。

既然你写了P/Invoke调用的两端,你应该遵循这些相同的规则,让你的生活变得轻松。就内存分配而言,大部分时间调用者负责释放任何跨越P/Invoke边界的内存,因为被调用者不知道是否/何时可以安全地执行此操作。这包括:

  • 如果为参数分配内存,并传递它
  • 如果是由被叫方分配和返回

在这两种情况下的out参数或返回值,只有调用者知道何时不再需要内存并且可以安全地释放内存。在P/Invoke调用的情况下,运行时编组人员知道这一点,并且它会分配内存以在编组调用之前将您的double[]编组到double *,然后在调用返回时释放该内存。根据ref,out,[In][Out]属性的组合,它可能会也可能不会尝试将数据复制回您的double[],但它将始终释放该内存。

+0

感谢您的好评! – 2014-11-09 10:19:23

相关问题