什么是非托管堆?
我认为CLR管理的任何基于对象的内存都是托管堆,那么为什么我们要讨论一个非托管堆呢?
答案 0 :(得分:10)
想象一下,您使用P / Invoke调用Win32函数,并使用malloc
分配一些内存。垃圾收集器没有该内存的可见性 - 它是非托管。
当然,您可能会或可能不会听到这个词的上下文 - 如果您可以向我们提供一些示例,我们可以为您提供更多帮助。
答案 1 :(得分:5)
根据John Skeet - managed
堆是.net将为您管理的堆,所有标准对象都是在其上创建的,您通常不需要太多关注,因为它是受管理的
unmanaged
表示您个人正在分配内存,因此您个人有责任解除分配,自行管理,并跟踪正在使用的内容。
所以是的,对象内存(在正常对象创建和破坏的意义上,从对象派生的东西)被管理。这是你需要担心的其他东西 - 为它们分配的非对象和内存。
答案 2 :(得分:0)
为了理解.net中的非托管Heap,我们需要了解托管堆是什么。
在.net框架中,我们有Garbage收集器,它由Common语言例程初始化。在其初始化期间,Garbage收集器分配一段内存来存储和管理由托管代码实例化的对象。这个内存称为托管堆,而不是到操作系统中的本机堆。
非托管堆是非托管代码/本机代码用于在运行时分配内存的堆。此堆不受垃圾收集器的控制,开发人员需要处理它以释放分配的内存。 Difference between "managed" and "unmanaged"