分段错误(C ++指针)

时间:2019-12-01 09:28:35

标签: 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; } 
};

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

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;
   }
};

但是在编译并运行后,它会引发此错误“分段错误(核心已转储)”

我对分段错误有一点了解,例如尝试访问不再存在的内存位置,但是在此示例中我没有得到它,没有任何帮助吗?

1 个答案:

答案 0 :(得分:1)

主要问题是您不使用空指针初始化下一个指针,但是默认情况下您假设它是空指针。解决方法如下:

multiple

此外,在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
  • 您应该考虑使用成员initializer lists而不是this->val
  • 初始化所有构造函数中的所有成员。