c++ - 段错误(C++ 指针)

标签 c++ pointers memory-management

我正在尝试使用节点类和指向下一个节点的指针在 C++ 中实现链表类。

template<class T>
class Node {
    public: T val;
    public: Node* next;
    public: Node() { }
    public: Node(T val) { this.val = val; } 
};

我创建了一个链表类,它有一个指向头部的指针和一个函数 append 以将节点添加到列表中:

template<class T>
class LinkedList {
   private: Node<T>* head;

   public: LinkedList() { }
   public: LinkedList(T val) { head -> val = val; }

   public: void append(T val) {
       Node<T>* temp = head;
       while(temp -> val != NULL) {
           temp = temp -> next;
       }
       temp -> val = val;
   }
};

但是编译运行后,报错“Segmentation fault (core dumped)”

我知道一些关于段错误的知识,比如试图访问一个不再存在的内存位置,但我在这个例子中没有得到它,有什么帮助吗?

最佳答案

主要问题是你没有用空指针初始化下一个指针,而是默认它是空指针。修复方法如下:

template <class T>
class Node {
 public:
  T val;
  Node* next;
  Node( T val_ = {} )
    : val{ val_ }
    , next{ nullptr }
  { }
};

除此之外,append 也有问题。代码应该是这样的:

template <class T>
class Node {
public:
    T val;
    Node* next;
    Node(T val_ = {}) : val{ val_ }, next{ nullptr } {}
};

template <class T>
class LinkedList {
private:
    Node<T>* head;

public:
    LinkedList(T val_ = {}) : head{ new Node{val_} } {}

    void append(T val) {
        Node<T>* temp = head;
        while (temp->next != nullptr) {
            temp = temp->next;
        }
        temp->next = new Node<T>{ val };
    }
};

int main() {
    LinkedList<int> l;
    l.append(10);
}

其他评论:

  • this.val 不会编译,因为 this 是一个指针。你的意思是 this->val
  • 您应该考虑使用成员(member) initializer lists而不是 this->val = val
  • 初始化所有构造函数中的所有成员。

关于c++ - 段错误(C++ 指针),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59124227/

相关文章:

c - 开发了一个 strtok 替代品

c - 通过引用传入二维数组

C++ 指针设置为地址,但在程序的不同部分莫名其妙地指向不同的值

c++ - 什么是 `using namespace std;` ,为什么我需要它来使用最新的 C++ 编译器编译程序?

c++ - 如何使用visual studio在c中捕获全屏

c++ - 在 QT 中获取普通用户桌面路径

c - 为什么 mac OS X 不会在此代码中抛出运行时错误?

c++ - IDE 认为仿函数是构造函数?

c++ - std::vector 及其初始化指针一致性

c - 分配失败怎么办?