为链表中的节点分配内存,但出乎意料的是,它内部的下一个节点也被分配了

allocate memory for node in linked list but unexpectedly, the next node inside it is also allocated

本文关键字:分配 节点 下一个 内部 链表 内存 出乎意料      更新时间:2023-10-16

我试图实现一个链表,但当我为一个音符分配内存时,它里面的指针不是NULL。

这是我的结构

template <typename T>
struct Node {
  T value;
  Node* next;
};

我为纸币分配内存

first = new Node<T>;

第一个->下一个不为NULL。这迫使我将该注释显式指定为NULL。这真的让我很困惑。但是为什么会发生这种事呢?

在设置之前,未初始化指针的地址是未定义的。当您调用new Node<T>时,您正在调用默认初始化

默认初始化在三种情况下执行:

  1. 当声明具有自动、静态或线程本地存储持续时间的变量时,不使用初始值设定项
  2. 当具有动态存储持续时间的对象是由不带初始值设定项的新表达式创建的或当对象是由带初始值设置项的空括号的新表达式来创建的(直到C++03(
  3. 当构造函数初始值设定项列表中没有提到基类或非静态数据成员,并且调用了该构造函数时

默认初始化的影响是:

  • 如果T是非POD(直到C++11(类类型,则考虑构造函数,并对空参数列表进行重载解析。调用所选的构造函数(它是默认构造函数之一(来为新对象提供初始值
  • 如果T是数组类型,则默认初始化数组中的每个元素
  • 否则,将不执行任何操作:具有自动存储持续时间的对象(及其子对象(将初始化为不确定的值

要初始化struct值,您需要将其称为

first = new Node<T>();

注意,注释2的后半部分(非粗体部分(在C++11及以后不再为真,现在以下内容为真:

§8.5初始化程序

初始化器是一组空括号的对象,即()应进行值初始化。

它有一些垃圾值。您应该在构造函数中初始化它。

Node() : next(0), value(T()) {}

或者你可以直接使用

first = new Node<T>();

对于CCD_ 4。