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

thi*_*inh 1 c++ pointers linked-list dynamic-allocation

我正在尝试实现一个链表,但是当我为一个音符分配内存时,其中的指针不是NULL.

这是我的结构

template <typename T>
struct Node {
  T value;
  Node* next;
};
Run Code Online (Sandbox Code Playgroud)

我为笔记分配内存

first = new Node<T>;
Run Code Online (Sandbox Code Playgroud)

first-> next不是NULL.这迫使我明确地将该注释分配给NULL.这让我很困惑.但为什么会这样呢?

Cor*_*mer 7

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

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

  1. 当声明自动,静态或线程本地存储持续时间的变量时,没有初始化程序.
  2. 当一个具有动态存储持续时间的对象是由一个没有初始化程序的new-expression创建的,或者一个对象是由一个new-expression创建的,初始化程序由一对空括号组成(直到C++ 03)
  3. 在构造函数初始值设定项列表中未提及基类或非静态数据成员且调用该构造函数时.

默认初始化的效果是:

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

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

first = new Node<T>();
Run Code Online (Sandbox Code Playgroud)

请注意,从C++ 11及更高版本开始,注释2的后半部分(非粗体部分)不再成立,现在满足以下条件:

§8.5初始化器

一个对象,其初始化程序是一组空的括号,即()应进行值初始化.