【问题标题】:how to find whether object sharing common memory or different memory allocation如何查找对象是否共享公共内存或不同的内存分配
【发布时间】:2016-06-23 17:48:55
【问题描述】:

我想从内存分配的角度了解以下代码的行为。

我有两个 List 对象,如下所示。

        var list1 = new List< string > (){ "A","B" };
        var list2 = new List<string>();
        list2 = list1;
        list1 = null;

当我将 list1 设置为 null 时,list2 对象保持原样。

但我再次尝试在分配给 list2 后修改 list1 对象,然后 list2 的值更改为最新的 list1。我对这种行为有点困惑。

更改代码 sn-p:

        var list1 = new List< string > (){ "A","B" };
        var list2 = new List<string>();
        list2 = list1;
        list1.Add("C");
        list1 = null;

在上面的代码中,当我将 list1 分配给 list2 时,list 有 2 个字符串,但后来我向 list1 添加了一个字符串,甚至将相同的字符串添加到了 list2。为什么?

【问题讨论】:

  • 您可以将list2 = list 1读作“使list2引用指向与list1在内存中相同的位置”,并且list2指向的对象被标记为垃圾回收,因为没有任何东西指向它。然后,当您设置 list1 = null 时,这意味着“使 list1 引用指向未分配的对象”
  • 在第二个示例中,两个变量都指向内存中完全相同的位置,因此添加到 list1 与添加到 list2 相同。

标签: c#


【解决方案1】:

让我们假设每个List&lt;String&gt; 是一所房子,每个变量list1list2 是一张纸。让我带你看看正在发生的事情的类比。

第一行代码实际上做了3个步骤:

在这一步中,您正在建造一个有两个房间 A 和 B 的房子

           new List<string> (){ "A","B" };

在这一步中,您将制作一张名为“list1”的新纸

var list1

在这一步中,您将在名为“list1”的纸上写下房子的地址

list1 = ...

下一行代码再次执行相同的 3 个步骤

在这一步中,你正在建造一座没有房间的房子

           new List<string> ();

在这一步中,您将制作一张名为“list2”的新纸

var list2

在这一步中,您将在名为“list2”的纸上写下您建造的第二所房子的地址

list2 = ...

接下来的步骤

在这一步中,您获取写在名为“list1”的纸上的地址,并擦除写在名为“list2”的纸上的地址,并将其替换为“list1”中的地址

list2 = list1;

你开车到写在名为“list1”的纸上的地址(与写在名为“list2”的纸上的地址相同)并建造一个名为“C”的新房间

list1.Add("C");

在此步骤中,您将擦除写在名为“list1”的纸上的地址

list1 = null;

希望通过这个类比,为什么当您修改房子(一个对象)时,谁的地址写在一张纸(一个变量)上,另一张写有相同地址的纸(另一个变量)也看到了变化。

【讨论】:

    【解决方案2】:

    list1list2 对 ONE 对象有两个相同的引用。当您将“C”添加到list1 时,您会更改一个对象。当您将 null 设置为 list1 时,您只会删除对 ONE 对象的引用,但该对象仍保留在内存中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-22
      • 1970-01-01
      • 2022-11-25
      • 2011-10-14
      • 2021-11-26
      • 2021-06-15
      • 1970-01-01
      相关资源
      最近更新 更多