当从C#创建COM对象或任何其他非托管实例时,系统中如何分配非托管内存?
答案 0 :(得分:6)
CLR为要实例化的COM对象创建一个Runtime Callable Wrapper(RCW)。这是从.NET到COM系统的一种互操作代理。因此,您创建的COM对象被分配,并在CLR中创建对它的引用,这将它放在堆上。
您必须始终在包含对RCW的引用的类中实现IDisposable
,因为它们不会自动清理(包装器在.NET堆上,但COM对象本身不是)。在包装器上调用Dispose()
会释放COM对象。因此,未实现IDisposable
会导致内存泄漏。
答案 1 :(得分:0)
我的猜测是他们调用操作系统在非托管堆上创建内存。 CLR显然与他们无关,因为他们没有管理。