c# - 使用 C# 和 C++ 非托管时的内存分配/解除分配

标签 c# c++ memory-management unmanaged

我正在处理一些 C# 和 C++ 非托管代码,在处理内存时有两件事我不明白。如果有人可以帮助我理解:

  1. 如果变量在 C# 下动态分配(使用 new),然后传递给 C++ 非托管代码。用户是否需要在 C++ 非托管代码下手动释放该变量内存?

  2. 如果一个变量在 C++ 非托管下动态分配(使用 new)然后传递给 C#,那么可以说垃圾收集器将释放该内存是否安全?

最佳答案

  1. 不,因为对象是在托管堆上分配的,GC 将照常处理释放。问题是你必须告诉他在从非托管代码使用对象时不要释放或更改对象的地址,因为 GC 不知道你要从非托管代码使用对象多长时间。这可以通过 PINNING 对象来完成。 查看 this 的答案问题。

  2. 不,因为对象是在 C++ 非托管堆上分配的,GC 不会触及它。您必须使用 delete 自行解除分配。

编辑: 如果您需要在托管代码中分配一个对象并在非托管代码中取消分配,反之亦然,最好知道有用于此目的的操作系统堆,您可以通过 Marshal.AllocHGlobal 使用它。和 Marshal.FreeHGlobal C#调用,C++也会有类似的调用。

关于c# - 使用 C# 和 C++ 非托管时的内存分配/解除分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45348804/

相关文章:

c++ - `auto` 的 ref- 和 cv-stripping 属性。

c++ - 返回静态局部变量作为引用

c# - ViewModel 成员的可见性应该是多少?

c# - 防止公共(public)服务过度使用

C++ 并初始化 const 变量

c++ - 使用 mmap() 时从 'void*' 到 'char*' 的无效转换

c# - 如何阻止 TabItem 四处移动

c# - 类是否还应该负责将自身的数据存储到数据库中?

ubuntu - Ubuntu中的内存分配

objective-c - Objective-C : Releasing int/float properties