链接列表C++类这两个添加节点实现之间的差异是什么?

xxx*_*562 2 c++ linked-list

我为链表编写了以下课程.添加新节点(addValue1addValue2)有两个单独的功能.一个使用指针到节点,另一个不使用.

#include <stdlib.h>
#include <iostream>

class linkedList{
private:
    struct Node {
        int data;
        Node* next;
    };
    Node* head;

public:
    linkedList(){
       //constructor
        this->head = NULL;
    }

    ~linkedList(){
        //destructor
    }

    void addValue1(int n) {
        Node* newNode = new Node();
        newNode->data = n;
        newNode->next = head;
        this->head = newNode;
    }

    void addValue2(int n) {
        Node newNode;
        newNode.data = n;
        newNode.next = head;
        this->head = &newNode;
    }

    void print(){
        Node* curNode = this->head;
        while(this->head != NULL) {
            std::cout << curNode->data << " "<< std::endl;
            curNode = curNode->next;
        }
    }

};

int main() {


    linkedList llist;

    llist.addValue2(5);
    llist.addValue1(4);
    llist.addValue1(9);
    llist.print();

}
Run Code Online (Sandbox Code Playgroud)

推荐这两个中的哪一个,为什么?这两者有什么区别吗?如果我们不使用new运算符,我们以后不需要使用delete运算符.这似乎对我有利.是真的吗?

Bat*_*eba 6

addValue2因为你要存储一个指向newNode具有自动存储持续时间的节点的指针,所以会造成严重破坏.一旦超出范围,指针&newNode悬空.

繁荣!

请注意,如果编译器会为您做什么,那么显式编写析构函数也是不合时宜的.如果你需要引入析构函数,virtual然后编写它

virtual ~linkedList() = default;
Run Code Online (Sandbox Code Playgroud)

在你的情况下,虽然你需要delete分配的节点,new否则你的类将泄漏内存.

最后,如果您根本不想担心内存,请使用

typedef linkedList std::list;
Run Code Online (Sandbox Code Playgroud)

然后前往酒吧.

  • @ user87466取消引用悬空指针是未定义的行为.总是.它可能_seem_为一个特定案件工作,但不保证.由于大量可能的用例调用未定义的行为,因此无法通过反复试验来学习C++. (3认同)