我有以下代码:
Student s = new Student();
Student s2 = s;
s2 = new Student();
s = s2;
在代码的每一步中,内存会发生什么?
答案 0 :(得分:4)
假设"学生" type是引用类型(类),而不是值类型(struct):
Student s = new Student();
分配了一个新的Student对象的内存,以及一个新的引用" s"已创建并设置为引用新内存。
Student s2 = s;
新参考" s2"创建并设置为引用与" s"相同的对象和内存。没有创建新对象,只分配了足够的内存来计算引用。
s2 = new Student();
分配新Student对象的内存。 " s2"引用被更改为引用此新对象。 " S"仍然指的是先前创建的对象。
s = s2;
" S"更改为引用在前一行创建的对象和内存。没有分配或释放新内存。但是,现在没有任何内容涉及在第一行创建的原始对象。该对象不再具有根基。下次垃圾收集器运行时,该对象将有资格进行收集。
答案 1 :(得分:2)
考虑Student
是class
:
1. Student s = new Student();
在托管内存中创建一个对象,并将其引用分配给s
2. Student s2 = s;
创建了另一个引用s2
,它指向与s
相同的实例。
3. s2 = new Student();
s2
从托管内存中分配了Student
的新实例。
4. s = s2;
s
现在指向与s2
相同的实例。因此,s
和s2
都指向同一个实例,并且在步骤1中创建的上一个实例符合垃圾回收的条件。
你应该阅读Eric Lippert的以下文章。