首页 > 解决方案 > 为什么实际节点必须是指针?

问题描述

那么当我们实际创建节点对象的时候,为什么它必须是一个指针呢?为什么不能只是让它成为一个常规的 Node 对象,使用 . 对于数据,然后使用箭头运算符作为下一个节点。

class Node {
      int data;
      Node * next;
};

  int main() {
    Node * node1, node2; // why make it a pointer
    Node node3, node4; // Why dont people leave it has non pointer, 
    because you already have Node* next in the class.
   }

标签: c++

解决方案


指针与动态分配配合得很好。您可以通过指针继续使用该对象,直到您有目的地释放它。另一方面,自动对象在作用域结束时被销毁,使所有指向它们的指针(和引用!1)悬空。

如果您知道不会使用包含对象本身的范围之外的任何指针(这对于您在 中的示例可能是正确的main()),那么请继续使用自动对象。

但最后一个复杂情况是,如果其中一个指针是知道如何释放它指向的对象的“智能”指针,则必须使用匹配的分配函数创建附加对象。尝试释放自动(范围)2对象只会导致痛苦。


1诸如“引用等同于对象本身”和“定义良好的程序不能创建无效引用”之类的经常重复的陈述是非常错误的,但这里讨论的时间太长了。

2痛苦还伴随着试图释放静态对象或成员子对象或使用不同分配器动态分配的对象。


推荐阅读