【问题标题】:allocate memory for node in linked list but unexpectedly, the next node inside it is also allocated为链表中的节点分配内存,但出乎意料的是,其中的下一个节点也被分配了
【发布时间】:2015-11-11 08:49:16
【问题描述】:

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

这是我的结构

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

我为笔记分配内存

first = new Node<T>;

第一个->下一个不为 NULL。这迫使我将该注释显式分配给 NULL。这真的让我很困惑。但是为什么会这样呢?

【问题讨论】:

  • 发生这种情况是因为 C++ 不会自动为您初始化所有内容。您对此感到惊讶的事实表明您已经超越了基础知识,直接进入了模板。即使您以前有过编程经验,最好先学习基础知识(这就是最大的惊喜所在)。

标签: c++ pointers linked-list dynamic-allocation


【解决方案1】:

未初始化指针的地址在您设置之前是未定义的。当您调用new Node&lt;T&gt; 时,您正在调用default-initialization

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

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

默认初始化的效果是:

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

要拥有struct value-initialized,您需要将其称为

first = new Node<T>();

请注意,注释 2 的后半部分(非粗体部分)在 C++11 及更高版本中不再正确,现在以下为正确:

§8.5 初始化器

初始化器为空括号集的对象,即(),应进行值初始化。

【讨论】:

    【解决方案2】:

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

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

    或者你可以使用

    first = new Node<T>();
    

    value-initialization

    【讨论】:

      猜你喜欢
      • 2023-03-19
      • 2020-12-08
      • 1970-01-01
      • 1970-01-01
      • 2016-08-30
      • 1970-01-01
      • 1970-01-01
      • 2013-08-26
      • 2019-09-19
      相关资源
      最近更新 更多