创建对象时内存中发生了什么



我有以下代码:

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

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

假设"Student"类型是引用类型(类),而不是值类型(结构):

Student s = new Student();

为一个新的Student对象分配内存,创建一个新的引用"s",并将其设置为引用新内存。

Student s2 = s;

创建一个新的引用"s2",并将其设置为与"s"指向相同的对象和内存。没有创建新对象,只分配足够的内存来解释引用。

s2 = new Student();

为一个新的Student对象分配内存。"s2"引用被更改为引用这个新对象。"s"仍然是指先前创建的对象。

s = s2;

"s"被更改为引用在前一行创建的对象和内存。没有分配或释放新的内存。但是,现在没有任何内容引用第一行中创建的原始对象。该对象不再是根对象。下次垃圾回收器运行时,该对象将有资格被回收。

考虑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. 栈是一个实现细节,第一部分
  2. 栈是一个实现细节,第二部分

最新更新