【问题标题】:Marshalling between C# and C++, and the Juggling of ResponsibilitiesC# 和 C++ 之间的编组,以及职责的杂耍
【发布时间】:2011-04-07 09:10:12
【问题描述】:

如果我有一个本地 C++ 函数,根据函数的结果,删除某个指针 (delete[]) 的责任在调用者和函数之间是不同的。我当然会检查返回值并在 C++ 中采取相应的行动。

问题是,如果函数在 C++ 和 C# 之间编组,在 C# 中将指针设置为 null 就足够了吗?

【问题讨论】:

  • 数据在 C# 和 c++ 之间编组,而不是函数。你能改写你的问题吗?

标签: c# .net c++ pointers memory-management


【解决方案1】:

没有。 C# 不能像 C++ 中的 delete[] 那样做。您必须使用共享内存分配 API,或编写处理清理的 C++ 包装器。

【讨论】:

  • 如何让对象 = null?那岂不是让永远值得信赖的垃圾人收集未使用的内存?
  • 你的意思是CLR垃圾收集器?不,它不知道本地 C++ 代码中分配的内存。
  • 如果类型被编组为 IntPtr 怎么办?
  • 那么你仍然需要调用一些内存释放函数来释放 IntPtr 指向的内存。无论是 Windows 内存分配函数之一还是调用 delete[] 的 C++ 库中的函数。
【解决方案2】:

不,只需将本机代码中分配的指针设置为null 不会释放内存。 CLR 只能垃圾收集它知道的内存(也称为托管内存)。它不知道本机内存,因此无法收集它。必须显式释放在托管类型中拥有所有权的任何本机内存。

最常见的方法是通过 Marshal 类上的 Alloc 和 Free 函数

【讨论】:

  • 如果类型没有编组为 IntPtr 怎么办?
  • @Voulnet,那是一个错误。如果代码是内存地址并且没有被编组为IntPtr,它将无法在 64 位进程中工作
猜你喜欢
  • 2011-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-19
相关资源
最近更新 更多