c# - 创建对象时内存会发生什么?

时间:2014-08-06 14:58:21

标签: c# memory

我有以下代码:

Student s = new Student();
Student s2 = s;
s2 = new Student();
s = s2;

在代码的每一步中,内存会发生什么?

2 个答案:

答案 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)

考虑Studentclass

1. Student s = new Student();

在托管内存中创建一个对象,并将其引用分配给s

2. Student s2 = s;

创建了另一个引用s2,它指向与s相同的实例。

3. s2 = new Student();

s2从托管内存中分配了Student的新实例。

4. s = s2;

s现在指向与s2相同的实例。因此,ss2都指向同一个实例,并且在步骤1中创建的上一个实例符合垃圾回收的条件。

你应该阅读Eric Lippert的以下文章。

  1. The Stack Is An Implementation Detail, Part One
  2. The Stack Is An Implementation Detail, Part Two