如何在C#中销毁/收集非托管对象

时间:2015-07-08 16:40:55

标签: c# c++-cli dispose

这是一个场景:
在托管的c ++ dll中定义了一个类,并在C#项目中使用。

public ref class AClass {
// ......
  XParameters m_oParams;
  property XParameters^ Parameters {
           XParameters^ get() { return m_oParams; }
        }

}

XParameters是C#侧可见的另一个托管的c ++定义类。

C#代码如下所示:

var aClass = new AClass();
var oParams = aClass.Parameters;
aClass = null;

实际上,我想保证oParams在为aClass对象本身分配null后变为null。 有办法吗?

aClass = null调用时到底发生了什么?

2 个答案:

答案 0 :(得分:1)

aClass = null调用时会发生什么?”:aClass变为null,而aClass之前引用的对象才有资格获得GC,如果它是最后一次引用对象(但这是隐式效果 - 现在没有“GC标记”行为)。

对象无法知道何时符合GC条件(因为它是隐式操作),或者对实例的引用是否更改为null /其他对象。所以没有办法“保证在为aClass指定null之后oParams变为null”。

答案 1 :(得分:1)

当调用aClass = null时,它现在是一个空引用。它并没有改变oParams。在C#中,用户处理后无需将对象设置为null。

在这种情况下,最好将代码包装在使用状态。

using (var aClass = new AClass()){
   var oParams = aClass.Parameters;
   //do stuff
};//object is disposed

如果您将代码包装在try..finallyusing()块中),则对象的终结器方法应为您调用Dispose()

可以在此处找到有关C#内存管理的良好资源: http://codebetter.com/karlseguin/2008/04/28/foundations-of-programming-pt-7-back-to-basics-memory/