嗨,我正在做一些有趣的工作,制作一个从 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
中名为 k
的 plots
成员永远不会被初始化,因此当您调用 append 时会崩溃
来自 John
构造函数。
[正如 Neil Butterworth 评论的那样,如果您实际上构建了一个 ll
实例,那么它还会存在其他问题,这只是最直接的问题。]
关于c++ - 手写链表出现段错误,我不明白为什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2428631/