问题描述
|
我有一个unmanged类和ref类,它们在逻辑上是相连的:
public ref class RefBlah
{
~RefBlah();
!RefBlah();
internal:
UnManagedBlah* m_unmanaged;
}
public class UnManagedBlah
{
public:
gcroot<RefBlah^> refBlah;
}
RefBlah类始终创建UnManagedBlah的实例,该实例保存对创建它的对象的引用。
现在,当我在C#应用程序中创建RefBlah的实例时,它超出范围就不会被释放。 (我已经等着看所有其他对象都被释放了,但是它拒绝删除自己)。
据我所知,如果它们都是常规的.Net对象,则它们将在类超出范围时被收集,因为尽管引用计数未达到0。并且那是因为没有引用根到主堆栈中的对象。
.NET GC是否会以不同方式对待非托管类的引用?
如何更改设计以使RefBlah销毁?
解决方法
我认为您有一个循环参考问题。直到
UnManagedBlah
中的引用被GC \',1ѭ才会获得GC,只有在删除only1ѭ等中的指针时才会发生。
如果您需要在非托管类中有一个引用,那么也许应该是一个弱引用?看一下GCHandle
结构:
GCHandle类与
GCHandleType枚举创建一个
对应于任何托管的句柄
宾语。该手柄可以是四个手柄之一
类型:弱,WeakTrackResurrection,
正常或固定。当手柄有
被分配,您可以使用它来
防止被管理对象被
由垃圾收集器收集
当非托管客户持有
仅供参考。没有这样的把手
物体可以被收集
完成之前的垃圾收集器
它的工作代表着不受管理
客户。