如何理解C++中链表的自由实现?

如何理解C++中链表的自由实现?,c++,linked-list,C++,Linked List,最后几行我不懂 // Singly linked list node with freelist support template<typename Elem> class Link { private: static Link<Elem>* freelist; // Reference to freelist head public: Elem element; // Value for this node Link* next

最后几行我不懂

// Singly linked list node with freelist support
template<typename Elem> class Link {
private:
  static Link<Elem>* freelist; // Reference to freelist head
public:
  Elem element;                // Value for this node
  Link* next;                  // Point to next node in list

  // Constructors
  Link(const Elem& elemval, Link* nextval = NULL)
    { element = elemval; next = nextval; }
  Link(Link* nextval = NULL) { next = nextval; }

  void* operator new(size_t) { // Overloaded new operator
    if (freelist == NULL) return ::new Link; // Create space
    Link<Elem>* temp = freelist; // Can take from freelist
    freelist = freelist->next;
    return temp;                 // Return the link
  }

  // Overloaded delete operator
  void operator delete(void* ptr) {
    ((Link<Elem>*)ptr)->next = freelist; // Put on freelist
    freelist = (Link<Elem>*)ptr;
  }
};

// The freelist head pointer is actually created here
template<typename Elem>
Link<Elem>* Link<Elem>::freelist = NULL;
特别是,为什么我们需要定义指向最后一行中指针的指针?freelist已经是一个指针了,那么为什么我们需要将指向该指针的另一个指针设置为NULL呢


有人能帮我澄清一下吗?我很困惑。

把你的例子浓缩下来,这就是你所拥有的:

class Link {
    static Link* freelist;
}

Link* Link::freelist = NULL;

正如注释所提到的,自由列表头指针实际上是在这里创建的。第一部分是静态变量freelist的声明,但实际上并没有定义它。下面的定义模仿了该声明,并给它一个值。它不会添加另一个级别的指针。

将您的示例提取下来,这就是您所拥有的:

class Link {
    static Link* freelist;
}

Link* Link::freelist = NULL;

正如注释所提到的,自由列表头指针实际上是在这里创建的。第一部分是静态变量freelist的声明,但实际上并没有定义它。下面的定义模仿了该声明,并给它一个值。它不添加其他级别的指针。

声明类的静态非常量成员只需要一个越界定义。 静态成员不使用其类对象的存储,因此您必须单独声明和初始化它自己的存储

class Link {
    static Link* freelist; // declaring that such object exists
};

// Shouldn't appear in a header file  to not break One Definition Rule
Link* Link::freelist = nullptr; // initialization

freelist实际上是一个全局变量,可以通过类Link的上下文进行访问,例如Link::freelist(如果它是公共的)。在这种特殊情况下,它只是在类对象的所有实例之间共享

类的静态非常量成员的声明只需要一个越界定义。 静态成员不使用其类对象的存储,因此您必须单独声明和初始化它自己的存储

class Link {
    static Link* freelist; // declaring that such object exists
};

// Shouldn't appear in a header file  to not break One Definition Rule
Link* Link::freelist = nullptr; // initialization

freelist实际上是一个全局变量,可以通过类Link的上下文进行访问,例如Link::freelist(如果它是公共的)。在这种特殊情况下,它只是在类对象的所有实例之间共享

不仅最后两行应该提出问题,新操作员的实施也应该提出问题

让我们考虑下面的代码:

struct S { 
    // ... 
};

auto list = new List<S>;
样本输出:

0x24b8e80处的ctor 0x24b8e80处的ctor 0x24b8e80处的数据或
不仅最后两行应该提出问题,新运营商的实施也是如此

让我们考虑下面的代码:

struct S { 
    // ... 
};

auto list = new List<S>;
样本输出:

0x24b8e80处的ctor 0x24b8e80处的ctor 0x24b8e80处的数据或
请发布文字,而不是图片。图像不能很好地粘贴到IDE中。这些代码是从哪里产生的?构造链表类的方法有点笨拙——或者它有我不知道的用途。这段代码来自Clifford Shaffer的数据结构和算法分析。请发布文本,而不是图像。图像不能很好地粘贴到IDE中。这些代码是从哪里产生的?这在某种程度上是一种构造链表类的笨拙方法——或者它有一个我没有看到的用途。这段代码来自Clifford Shaffer的数据结构和算法分析。是否对运算符new的定义进行了一些小的调整来解决这一问题,或者这不是一个好的开始?对“新操作员”的定义是否有一个小的调整可以解决这个问题,或者这不是一个好的开始?