下面两段代码本质上是一样的,首先看看for循环内局部变量的生命周期。
(1)
在第i次循环,初始化变量obj引用了一个生成对象O1;但当此次循环结束时,变量obj被回收,所以对象O1可以被GC回收了;
在第i+1次循环,初始化新变量obj(跟第i次循环的obj没有任何关系)引用了一个生成对象O2;但当此次循环结束时,变量obj被回收,所以对象O2可以被GC回收了;
for (int i = 0; i < 10000; ++i) {
Object obj = new Object();
System.out.println("obj= "+ obj);
}
(2)
在第i次循环,变量obj引用了一个生成对象O1;但当此次循环结束时,对象O1不可以被GC回收;
在第i+1次循环,变量obj引用了一个生成对象O2,此时生成对象O1没有引用,所以对象O1可以被GC回收;但当此次循环结束时,对象O2不可以被GC回收;
注意,最后一个生成的对象即使在所有循环都结束后,会一直被obj引用;若要回收则需要再次令obj=null。
Object obj = null;
for (int i = 0; i < 10000; ++i) {
obj = new Object();
System.out.println("obj= "+ obj);
}
注意:C++中没有GC机制,一定要delete,而且要记好指针的值,不然只能等程序结束后,new出来的对象 才能被回收。