该对象已经被析构。
ObjectReliveTest.Program.relived = this; //复活
执行了对象复苏。但是,该对象已经被执行了终止化,使用他可能会导致不可预期的结果。(参考《.net框架程序设计》,p489)
如果被析构,那么,为什么CLR允许无意义的对象调用方法,而不是抛出异常?
既然是“不可预期的结果”,所以必须通过大量实验来进行观察。你可以多测试几次,你会发现某几次clr会抛出nullreference异常。
----------------------------------------------------------
~Reliver()
{
Console.WriteLine("正在析构复活类");
ObjectReliveTest.Program.relived = this; //复活
}
当对象的析构函数(finalize方法)被执行时,该对象的一个引用被放入了一个根中,从而使其又成为应用程序得一个可达对象。对象重新复苏以后,垃圾收集器不会再将其认为是可收集的对象,应用程序也可以自由的使用该对象。但是,该对象已经被执行了终止化,使用他可能会导致不可预期的结果。
换句话说,在对象执行了finalize方法以后,它的成员仍然可能被访问。
因此应该这样回答你这个问题:对象确实已经被析构,但是clr执行的这个析构,不是将对象从内存中抹掉,而是对它进行了特殊的标记,以便于在某一代龄的内存空间不足时流出空间,在此之前,应用程序仍然能够访问这个对象。 从这里也可以看出.net语言和c++的一些区别。
如果对您有帮助,请记得采纳为满意答案,谢谢!祝您生活愉快!
都是指针啊
第一个是说list里每个节点的类型是指向AbstractFile的指针
第二个是说getChildren函数返回值的类型是指向list
c++中引用数据类型和取地址符的区别是左值和右值的区别。
引用是左值,取地址运算符是右值,所谓左值指的是内存中映射的存储单元。
右值是存储单元中所存的数据。
int &a = b;和int *p = &a; 可以解释这两种不同的关系。
也就是说,被调函数与主调函数所使用的指针变量是一个指针变量,而并非一个参数传递时的拷贝。