【问题标题】:.NET - Why new allocated objects seem to be using the same memory address.NET - 为什么新分配的对象似乎使用相同的内存地址
【发布时间】:2023-01-12 10:12:39
【问题描述】:

我正在尝试完成创建 XOR 链表的挑战。但是,我无法完成它,因为每次我分配一个节点对象时,它都使用与前一个相同的内存块。

var list = new ListXOR();
list.Add(1);
list.Add(2);
list.Add(3);
list.Add(4);

Console.WriteLine("Done.");

class ListXOR
{
    private readonly List<Node> _nodes = new();

    public void Add(int value)
    {
        Node node = new(value);
        _nodes.Add(node);
        unsafe
        {
            Console.WriteLine("Address of new node {0}", (ulong)&node);
        }
    }

    private class Node
    {
        public int value;

        public Node(int newValue) => value = newValue;
    }
}

此代码在控制台中显示如下内容:

Address of new node 849654375800
Address of new node 849654375800
Address of new node 849654375800
Address of new node 849654375800
Done.

您还需要将其添加到您的*.csproj 文件中。

<AllowUnsafeBlocks>true</AllowUnsafeBlocks>

为什么会这样?有办法防止吗?

【问题讨论】:

  • 您实际上并没有获得节点的内存地址。您只是获取 node 变量的地址,不出所料,每次都是相同的。请参阅this 了解如何正确执行此操作。

标签: c# .net memory-management allocation


【解决方案1】:

为防止这种情况,您可以为每个节点对象创建一个新变量。例如,您可以将 Add 方法更改为以下内容:

Node node = new Node(value);
    _nodes.Add(node);
    unsafe
    {
        Console.WriteLine("Address of new node {0}", (ulong)&node);
    }

【讨论】:

  • 这就是他正在做的,他只是在使用不需要构造函数名称的较新的 c# 语法
  • 还是一样的结果。你可以试试看。但是 Node node = new Node(value)Node node = new(value) 是一回事,只是用来让代码更简洁。
猜你喜欢
  • 1970-01-01
  • 2021-05-16
  • 1970-01-01
  • 1970-01-01
  • 2014-11-27
  • 2016-12-18
  • 1970-01-01
  • 2015-01-22
  • 1970-01-01
相关资源
最近更新 更多