c++ - 手写链表出现段错误,我不明白为什么

标签 c++ class linked-list

嗨,我正在做一些有趣的工作,制作一个从 C++ 中运行 gnuplot 的界面,由于某种原因,我的链表实现失败了。

下面的代码在 plots->append(&plot) 行上失败。单步执行代码我发现由于某种原因析构函数 ~John()在构造函数 John() 之后立即调用,我似乎无法弄清楚为什么。

下面包含的代码是仅在 Plot* 上运行的精简版本。 。最初我将链表作为模板类。它工作得很好,如 ll<int>ll<char*>但由于某种原因它失败为 ll<Plot*> .

您能帮我找出失败的原因吗?也许可以帮助我理解如何让它发挥作用?

提前:非常感谢!

//B2S

#include <string.h>

class Plot{
  char title[80];
public:
  Plot(){  }
};

class Link{
  Plot* element;
  Link* next;
  Link* prev;
  friend class ll;
};

class ll{
  Link* head;
  Link* tail;
public:
  ll(){
    head = tail = new Link();
    head->prev = tail->prev = head->next = tail->next = head;
  }
  ~ll(){
    while (head!=tail){
      tail = tail->prev;
      delete tail->next;
    }
    delete head;
  }
  void append(Plot* element){
    tail->element = element;
    tail->next = new Link();
    tail->next->prev = tail;
    tail->next = tail;
  }
};

class John{
  ll* plots;
public:
  John(){
   plots= new ll();
  }
  ~John(){
    delete plots;
  }
  John(Plot* plot){
    John();
    plots->append(plot);
  }
};   

int main(){
  Plot p;
  John k(&p);
}

最佳答案

声明:

 John();

只是构造一个新的无名约翰,它被创建并立即销毁。无法(在当前版本的 C++ 中)从另一个构造函数或已构造的对象上调用构造函数。

这意味着您的 John 中名为 kplots 成员永远不会被初始化,因此当您调用 append 时会崩溃 来自 John 构造函数。

[正如 Neil Butterworth 评论的那样,如果您实际上构建了一个 ll 实例,那么它还会存在其他问题,这只是最直接的问题。]

关于c++ - 手写链表出现段错误,我不明白为什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2428631/

相关文章:

c++ - 这个字符串加法是一个有效的表达式吗?

c++ - 我怎样才能让一个对象在内存中的特定位置构造自己?

java - 在 LinkedList 中搜索 "Ingredient"并将它们组合起来

Java:创建 LinkedList 并将其转换为 ArrayList 进行排序是否有意义?

c++什么设计将有助于在使用监听器时避免多重继承

c++ - SDL2 与 OpenGL 4.4 : Triangle Not Rendering Properly

c++ - 我如何包含具有相同包含的多个类?

c++ - 编译器是如何被欺骗提供指向封闭类的指针的?

c# - 在类之间共享枚举

c - 链表插入和删除