C ++ / CLI引用类未释放

问题描述

| 我有一个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,   正常或固定。当手柄有   被分配,您可以使用它来   防止被管理对象被   由垃圾收集器收集   当非托管客户持有   仅供参考。没有这样的把手   物体可以被收集   完成之前的垃圾收集器   它的工作代表着不受管理   客户。